mirror of
https://codeberg.org/scip/pcp.git
synced 2025-12-16 19:40:57 +01:00
initial commit
This commit is contained in:
674
COPYING
Normal file
674
COPYING
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, 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
|
||||||
|
them 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 prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If 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 convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU 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
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
11
ChangeLog
Normal file
11
ChangeLog
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
0.1.1 changed output format of encrypted keys. now we
|
||||||
|
encode it properly with the Z85 encoding and add
|
||||||
|
a header and footer to it:
|
||||||
|
|
||||||
|
-----BEGN CURVE25519 SECRET KEY-----
|
||||||
|
0q<1MspXp=x>mBZsUJF:2#)o*!.nTKR8SK}0IfuMBmC1a&*?)JD4%$%I5<J2jj%m/k&$?lck
|
||||||
|
EIKTfhPnSR8Vvcu9i7Znf/v+ZvU<}K#v@+t#5]i{9FGgJT$Lu*i+<-we&P9+)6LjN=NW(PLYt
|
||||||
|
EU]wBzf{UrCgBNSHcGBT
|
||||||
|
-----END CURVE25519 SECRET KEY-----
|
||||||
|
|
||||||
|
0.0.1 initial version
|
||||||
370
INSTALL
Normal file
370
INSTALL
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the shell commands `./configure; make; make install' should
|
||||||
|
configure, build, and install this package. The following
|
||||||
|
more-detailed instructions are generic; see the `README' file for
|
||||||
|
instructions specific to this package. Some packages provide this
|
||||||
|
`INSTALL' file but do not implement all of the features documented
|
||||||
|
below. The lack of an optional feature in a given package is not
|
||||||
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||||
|
you want to change it or regenerate `configure' using a newer version
|
||||||
|
of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system.
|
||||||
|
|
||||||
|
Running `configure' might take a while. While running, it prints
|
||||||
|
some messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the `make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior `make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'. This
|
||||||
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU `make', it is safer to compile the package for one
|
||||||
|
architecture at a time in the source code directory. After you have
|
||||||
|
installed the package for one architecture, use `make distclean' before
|
||||||
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
|
you can set and what kinds of files go in them. In general, the
|
||||||
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
|
specifying just `--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to `configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
`make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, `make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
|
time for the entire installation to be relocated. The approach of
|
||||||
|
makefile variable overrides for each directory variable is required by
|
||||||
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
|
However, some platforms have known limitations with the semantics of
|
||||||
|
shared libraries that end up requiring recompilation when using this
|
||||||
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
`/alternate/directory' before all installation names. The approach of
|
||||||
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
|
at `configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of `make' will be. For these packages, running `./configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with `make V=1'; while running `./configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with `make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
|
CC is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX `make' updates targets which have the same time stamps as
|
||||||
|
their prerequisites, which makes it generally unusable when shipped
|
||||||
|
generated files such as `configure' are involved. Use GNU `make'
|
||||||
|
instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
|
to try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out
|
||||||
|
automatically, but needs to determine by the type of machine the package
|
||||||
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
|
a message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS
|
||||||
|
KERNEL-OS
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share,
|
||||||
|
you can create a site shell script called `config.site' that gives
|
||||||
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
|
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||||
|
this workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--help=short'
|
||||||
|
`--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
`configure', and exit. The `short' variant lists options used
|
||||||
|
only in the top level, while the `recursive' variant lists options
|
||||||
|
also present in any nested packages.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
|
for more details, including other options available for fine-tuning
|
||||||
|
the installation locations.
|
||||||
|
|
||||||
|
`--no-create'
|
||||||
|
`-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
||||||
8
Makefile.am
Normal file
8
Makefile.am
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
SUBDIRS = libpcp src man tests
|
||||||
|
ACLOCAL_AMFLAGS = -I config
|
||||||
|
|
||||||
|
test:
|
||||||
|
cd tests && make test
|
||||||
|
|
||||||
|
stresstest:
|
||||||
|
cd tests && make stresstest
|
||||||
755
Makefile.in
Normal file
755
Makefile.in
Normal file
@@ -0,0 +1,755 @@
|
|||||||
|
# Makefile.in generated by automake 1.12.4 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2012 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__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
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 = .
|
||||||
|
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in $(top_srcdir)/config/compile \
|
||||||
|
$(top_srcdir)/config/config.guess \
|
||||||
|
$(top_srcdir)/config/config.sub \
|
||||||
|
$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
|
||||||
|
$(top_srcdir)/config/missing $(top_srcdir)/configure AUTHORS \
|
||||||
|
COPYING ChangeLog INSTALL NEWS TODO config/compile \
|
||||||
|
config/config.guess config/config.sub config/install-sh \
|
||||||
|
config/ltmain.sh config/missing
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
|
||||||
|
$(top_srcdir)/config/ltoptions.m4 \
|
||||||
|
$(top_srcdir)/config/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/config/ltversion.m4 \
|
||||||
|
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno config.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/libpcp/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
|
distclean-recursive maintainer-clean-recursive
|
||||||
|
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
||||||
|
cscope distdir dist dist-all distcheck
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
CSCOPE = cscope
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
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"
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
DIST_TARGETS = dist-gzip
|
||||||
|
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@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
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@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
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@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
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@
|
||||||
|
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@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
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@
|
||||||
|
SUBDIRS = libpcp src man tests
|
||||||
|
ACLOCAL_AMFLAGS = -I config
|
||||||
|
all: all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
am--refresh: Makefile
|
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu Makefile
|
||||||
|
.PRECIOUS: 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;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool:
|
||||||
|
-rm -f libtool config.lt
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
$(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS):
|
||||||
|
@fail= failcom='exit 1'; \
|
||||||
|
for f in x $$MAKEFLAGS; do \
|
||||||
|
case $$f in \
|
||||||
|
*=* | --[!k]*);; \
|
||||||
|
*k*) failcom='fail=yes';; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
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"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||||
|
done
|
||||||
|
ctags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
||||||
|
done
|
||||||
|
cscopelist-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
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; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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
|
||||||
|
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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-recursive cscopelist
|
||||||
|
|
||||||
|
cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP)'; \
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
-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) | GZIP=$(GZIP_ENV) gzip -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
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir
|
||||||
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -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*) \
|
||||||
|
GZIP=$(GZIP_ENV) gzip -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*) \
|
||||||
|
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir)
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build $(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 \
|
||||||
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
&& $(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
|
||||||
|
check: check-recursive
|
||||||
|
all-am: Makefile
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
installdirs-am:
|
||||||
|
install: 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:
|
||||||
|
|
||||||
|
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-recursive
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-libtool \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-recursive
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-recursive
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am:
|
||||||
|
|
||||||
|
install-dvi: install-dvi-recursive
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
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 -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-recursive
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-recursive
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am:
|
||||||
|
|
||||||
|
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
|
||||||
|
cscopelist-recursive ctags-recursive install-am install-strip \
|
||||||
|
tags-recursive
|
||||||
|
|
||||||
|
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
||||||
|
all all-am am--refresh check check-am clean clean-cscope \
|
||||||
|
clean-generic clean-libtool cscope cscopelist \
|
||||||
|
cscopelist-recursive ctags ctags-recursive dist dist-all \
|
||||||
|
dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \
|
||||||
|
dist-zip distcheck distclean distclean-generic \
|
||||||
|
distclean-libtool distclean-tags distcleancheck distdir \
|
||||||
|
distuninstallcheck 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-info install-info-am install-man \
|
||||||
|
install-pdf install-pdf-am install-ps install-ps-am \
|
||||||
|
install-strip installcheck installcheck-am installdirs \
|
||||||
|
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||||
|
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||||
|
ps ps-am tags tags-recursive uninstall uninstall-am
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
cd tests && make test
|
||||||
|
|
||||||
|
stresstest:
|
||||||
|
cd tests && make stresstest
|
||||||
|
|
||||||
|
# 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:
|
||||||
156
README.pod
Normal file
156
README.pod
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<Pretty Curved Privacy> (pcp1) is a commandline utility which can
|
||||||
|
be used to encrypt files. B<pcp1> uses eliptc curve cryptography
|
||||||
|
for encryption (CURVE25519 by Dan J. Bernstein). While CURVE25519
|
||||||
|
is no worldwide accepted standard it hasn't been compromised by
|
||||||
|
the NSA - which might be better, depending on your point of view.
|
||||||
|
|
||||||
|
B<Caution>: since CURVE25519 is no accepted standard, B<pcp1> has
|
||||||
|
to be considered as experimental software. In fact, I wrote it just
|
||||||
|
to learn about the curve and see how it works.
|
||||||
|
|
||||||
|
Beside some differences it works like B<GNUPG>. So, if you already
|
||||||
|
know how to use gpg, you'll feel almost home.
|
||||||
|
|
||||||
|
=head1 QUICKSTART
|
||||||
|
|
||||||
|
Lets say, Alicia and Bobby want to exchange encrypted messages.
|
||||||
|
Here's what the've got to do.
|
||||||
|
|
||||||
|
First, both have create a secret key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -k pcp1 -k
|
||||||
|
|
||||||
|
After entering their name, email address and a passphrase to protect
|
||||||
|
the key, it will be stored in their B<vault file> (by default ~/.pcpvault).
|
||||||
|
|
||||||
|
Now, both of them have to export the public key part of their key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -p -O alicia.pub pcp1 -p -O bobby.pub
|
||||||
|
|
||||||
|
They've to exchange the public key somehow (which is not my
|
||||||
|
problem at the moment, use ssh, encrypted mail, whatever). Once exchanged,
|
||||||
|
they have to import it:
|
||||||
|
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -P -I bobby.pub pcp1 -P -I alicia.pub
|
||||||
|
|
||||||
|
They will see a response as this when done:
|
||||||
|
|
||||||
|
key 0x29A323A2C295D391 added to .pcpvault.
|
||||||
|
|
||||||
|
Now, Alicia finally writes the secret message, encrypts it and
|
||||||
|
sends it to Bobby, who in turn decrypts it:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
echo "Love you, honey" > letter
|
||||||
|
pcp1 -e -i 0x29A323A2C295D391 -I letter -O letter.z85
|
||||||
|
cat letter.z85 | mail bobby@foo.bar
|
||||||
|
|
||||||
|
pcp1 -d -I letter.z85 | less
|
||||||
|
|
||||||
|
And that's it.
|
||||||
|
|
||||||
|
Please note the big difference to B<GPG> though: both Alicia
|
||||||
|
AND Bobby have to enter the passphrase for their secret key!
|
||||||
|
That's the way CURVE25519 works: you encrypt a message using
|
||||||
|
your secret key and the recipients public key and the recipient
|
||||||
|
does the opposite, he uses his secret key and your public key
|
||||||
|
to actually decrypt the message.
|
||||||
|
|
||||||
|
Oh - and if you're wondering why I named them Alicia and Bobby:
|
||||||
|
I was just sick of Alice and Bob. We're running NSA-free, so we're
|
||||||
|
using other sample names as well.
|
||||||
|
|
||||||
|
=head1 INSTALLATION
|
||||||
|
|
||||||
|
There are currently no packages available, so B<pcp> has to be
|
||||||
|
compiled from source. Follow these steps:
|
||||||
|
|
||||||
|
First, you will need libsodium:
|
||||||
|
|
||||||
|
git clone git://github.com/jedisct1/libsodium.git
|
||||||
|
cd libsodium
|
||||||
|
./autogen.sh
|
||||||
|
./configure && make check
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Next, pcp:
|
||||||
|
|
||||||
|
git clone git://github.com/tlinden/pcp.git
|
||||||
|
cd pcp
|
||||||
|
./configure
|
||||||
|
sudo make install
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Optionally, you might run the unit tests:
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
=head1 DOCUMENTATION
|
||||||
|
|
||||||
|
To learn how to use B<pcp>, read the manpage:
|
||||||
|
|
||||||
|
man pcp1
|
||||||
|
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2013 by T.Linden <tom AT cpan DOT org>
|
||||||
|
|
||||||
|
=head1 ADDITIONAL COPYRIGHTS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<ZeroMQ Z85 encoding routine>
|
||||||
|
|
||||||
|
Copyright (c) 2007-2013 iMatix Corporation
|
||||||
|
Copyright (c) 2009-2011 250bpm s.r.o.
|
||||||
|
Copyright (c) 2010-2011 Miru Limited
|
||||||
|
Copyright (c) 2011 VMware, Inc.
|
||||||
|
Copyright (c) 2012 Spotify AB
|
||||||
|
|
||||||
|
=item B<Tarsnap readpass helpers>
|
||||||
|
|
||||||
|
Copyright 2009 Colin Percival
|
||||||
|
|
||||||
|
=item B<jen_hash() hash algorithm>
|
||||||
|
|
||||||
|
Bob Jenkins, Public Domain.
|
||||||
|
|
||||||
|
=item B<UTHASH hashing macros>
|
||||||
|
|
||||||
|
Copyright (c) 2003-2013, Troy D. Hanson
|
||||||
|
|
||||||
|
=item B<Random art image from OpenSSH keygen>
|
||||||
|
|
||||||
|
Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
|
||||||
|
Comitted by Alexander von Gernler in rev 1.7.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Every incorporated source code is opensource and licensed
|
||||||
|
under the B<GPL> as well.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
I<T.Linden <tom AT cpan DOT org>>
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
=head1 HOME
|
||||||
|
|
||||||
|
The homepage of Pretty Curved Privacy can be found on
|
||||||
|
http://www.daemon.de/PrettyCurvedPrivacy. The source is
|
||||||
|
on Github: https://github.com/TLINDEN/pcp
|
||||||
|
|
||||||
|
=cut
|
||||||
134
README.txt
Normal file
134
README.txt
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
DESCRIPTION
|
||||||
|
Pretty Curved Privacy (pcp1) is a commandline utility which can be used
|
||||||
|
to encrypt files. pcp1 uses eliptc curve cryptography for encryption
|
||||||
|
(CURVE25519 by Dan J. Bernstein). While CURVE25519 is no worldwide
|
||||||
|
accepted standard it hasn't been compromised by the NSA - which might be
|
||||||
|
better, depending on your point of view.
|
||||||
|
|
||||||
|
Caution: since CURVE25519 is no accepted standard, pcp1 has to be
|
||||||
|
considered as experimental software. In fact, I wrote it just to learn
|
||||||
|
about the curve and see how it works.
|
||||||
|
|
||||||
|
Beside some differences it works like GNUPG. So, if you already know how
|
||||||
|
to use gpg, you'll feel almost home.
|
||||||
|
|
||||||
|
QUICKSTART
|
||||||
|
Lets say, Alicia and Bobby want to exchange encrypted messages. Here's
|
||||||
|
what the've got to do.
|
||||||
|
|
||||||
|
First, both have create a secret key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -k pcp1 -k
|
||||||
|
|
||||||
|
After entering their name, email address and a passphrase to protect the
|
||||||
|
key, it will be stored in their vault file (by default ~/.pcpvault).
|
||||||
|
|
||||||
|
Now, both of them have to export the public key part of their key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -p -O alicia.pub pcp1 -p -O bobby.pub
|
||||||
|
|
||||||
|
They've to exchange the public key somehow (which is not my problem at
|
||||||
|
the moment, use ssh, encrypted mail, whatever). Once exchanged, they
|
||||||
|
have to import it:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -P -I bobby.pub pcp1 -P -I alicia.pub
|
||||||
|
|
||||||
|
They will see a response as this when done:
|
||||||
|
|
||||||
|
key 0x29A323A2C295D391 added to .pcpvault.
|
||||||
|
|
||||||
|
Now, Alicia finally writes the secret message, encrypts it and sends it
|
||||||
|
to Bobby, who in turn decrypts it:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
echo "Love you, honey" > letter
|
||||||
|
pcp1 -e -i 0x29A323A2C295D391 -I letter -O letter.z85
|
||||||
|
cat letter.z85 | mail bobby@foo.bar
|
||||||
|
|
||||||
|
pcp1 -d -I letter.z85 | less
|
||||||
|
|
||||||
|
And that's it.
|
||||||
|
|
||||||
|
Please note the big difference to GPG though: both Alicia AND Bobby have
|
||||||
|
to enter the passphrase for their secret key! That's the way CURVE25519
|
||||||
|
works: you encrypt a message using your secret key and the recipients
|
||||||
|
public key and the recipient does the opposite, he uses his secret key
|
||||||
|
and your public key to actually decrypt the message.
|
||||||
|
|
||||||
|
Oh - and if you're wondering why I named them Alicia and Bobby: I was
|
||||||
|
just sick of Alice and Bob. We're running NSA-free, so we're using other
|
||||||
|
sample names as well.
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
There are currently no packages available, so pcp has to be compiled
|
||||||
|
from source. Follow these steps:
|
||||||
|
|
||||||
|
First, you will need libsodium:
|
||||||
|
|
||||||
|
git clone git://github.com/jedisct1/libsodium.git
|
||||||
|
cd libsodium
|
||||||
|
./autogen.sh
|
||||||
|
./configure && make check
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Next, pcp:
|
||||||
|
|
||||||
|
git clone git://github.com/tlinden/pcp.git
|
||||||
|
cd pcp
|
||||||
|
./configure
|
||||||
|
sudo make install
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Optionally, you might run the unit tests:
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
DOCUMENTATION
|
||||||
|
To learn how to use pcp, read the manpage:
|
||||||
|
|
||||||
|
man pcp1
|
||||||
|
|
||||||
|
COPYRIGHT
|
||||||
|
Copyright (c) 2013 by T.Linden <tom AT cpan DOT org>
|
||||||
|
|
||||||
|
ADDITIONAL COPYRIGHTS
|
||||||
|
ZeroMQ Z85 encoding routine
|
||||||
|
Copyright (c) 2007-2013 iMatix Corporation
|
||||||
|
Copyright (c) 2009-2011 250bpm s.r.o.
|
||||||
|
Copyright (c) 2010-2011 Miru Limited
|
||||||
|
Copyright (c) 2011 VMware, Inc.
|
||||||
|
Copyright (c) 2012 Spotify AB
|
||||||
|
|
||||||
|
Tarsnap readpass helpers
|
||||||
|
Copyright 2009 Colin Percival
|
||||||
|
|
||||||
|
jen_hash() hash algorithm
|
||||||
|
Bob Jenkins, Public Domain.
|
||||||
|
|
||||||
|
UTHASH hashing macros
|
||||||
|
Copyright (c) 2003-2013, Troy D. Hanson
|
||||||
|
|
||||||
|
Random art image from OpenSSH keygen
|
||||||
|
Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
|
||||||
|
Comitted by Alexander von Gernler in rev 1.7.
|
||||||
|
|
||||||
|
Every incorporated source code is opensource and licensed under the GPL
|
||||||
|
as well.
|
||||||
|
|
||||||
|
AUTHORS
|
||||||
|
*T.Linden <tom AT cpan DOT org*>
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
Licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
HOME
|
||||||
|
The homepage of Pretty Curved Privacy can be found on
|
||||||
|
http://www.daemon.de/PrettyCurvedPrivacy. The source is on Github:
|
||||||
|
https://github.com/TLINDEN/pcp
|
||||||
|
|
||||||
2
TODO
Normal file
2
TODO
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
- always save vault to tmp, then validate it and copy if ok
|
||||||
|
- replace sys/endian.h by portable / configure
|
||||||
981
aclocal.m4
vendored
Normal file
981
aclocal.m4
vendored
Normal file
@@ -0,0 +1,981 @@
|
|||||||
|
# generated automatically by aclocal 1.12.4 -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2012 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_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-2012 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.12'
|
||||||
|
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.12.4], [],
|
||||||
|
[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.12.4])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-2012 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],
|
||||||
|
[dnl Rely on autoconf to set up CDPATH properly.
|
||||||
|
AC_PREREQ([2.50])dnl
|
||||||
|
# expand $ac_aux_dir to an absolute path
|
||||||
|
am_aux_dir=`cd $ac_aux_dir && pwd`
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_CONDITIONAL -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1997-2012 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-2012 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-2012 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],
|
||||||
|
[{
|
||||||
|
# Autoconf 2.62 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-2012 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.
|
||||||
|
|
||||||
|
# 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.62])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. For more info, see:
|
||||||
|
http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation])
|
||||||
|
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:
|
||||||
|
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
|
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
|
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
||||||
|
# We need awk for the "check" target. 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
|
||||||
|
dnl Support for Objective C++ was only introduced in Autoconf 2.65,
|
||||||
|
dnl but we still cater to Autoconf 2.62.
|
||||||
|
m4_ifdef([AC_PROG_OBJCXX],
|
||||||
|
[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
|
||||||
|
[_AM_DEPENDENCIES([OBJCXX])],
|
||||||
|
[m4_define([AC_PROG_OBJCXX],
|
||||||
|
m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl
|
||||||
|
])
|
||||||
|
_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
|
||||||
|
dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the
|
||||||
|
dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
|
||||||
|
dnl 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
|
||||||
|
])
|
||||||
|
|
||||||
|
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-2012 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}" != 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-2012 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])])
|
||||||
|
|
||||||
|
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2012 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
|
||||||
|
])
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2012 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.
|
||||||
|
AC_DEFUN([AM_PROG_CC_C_O],
|
||||||
|
[AC_REQUIRE([AC_PROG_CC_C_O])dnl
|
||||||
|
AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
|
AC_REQUIRE_AUX_FILE([compile])dnl
|
||||||
|
# FIXME: we rely on the cache variable name because
|
||||||
|
# there is no other way.
|
||||||
|
set dummy $CC
|
||||||
|
am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
|
||||||
|
eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
|
||||||
|
if test "$am_t" != 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
|
||||||
|
dnl Make sure AC_PROG_CC is never called again, or it will override our
|
||||||
|
dnl setting of CC.
|
||||||
|
m4_define([AC_PROG_CC],
|
||||||
|
[m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1997-2012 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 supports --run.
|
||||||
|
# If it does, 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 --run true"; then
|
||||||
|
am_missing_run="$MISSING --run "
|
||||||
|
else
|
||||||
|
am_missing_run=
|
||||||
|
AC_MSG_WARN(['missing' script is too old or missing])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2012 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])])
|
||||||
|
|
||||||
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2012 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) 2001-2012 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-2012 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-2012 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}'])
|
||||||
|
m4_if([$1], [v7],
|
||||||
|
[am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
|
||||||
|
[m4_case([$1], [ustar],, [pax],,
|
||||||
|
[m4_fatal([Unknown tar format])])
|
||||||
|
AC_MSG_CHECKING([how to create a $1 tar archive])
|
||||||
|
# Loop over all known methods to create a tar archive until one works.
|
||||||
|
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
|
||||||
|
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
|
||||||
|
# Do not fold the above two line into one, because Tru64 sh and
|
||||||
|
# Solaris sh will not grok spaces in the rhs of '-'.
|
||||||
|
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 <conftest.tar])
|
||||||
|
grep GrepMe conftest.dir/file >/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([config/libtool.m4])
|
||||||
|
m4_include([config/ltoptions.m4])
|
||||||
|
m4_include([config/ltsugar.m4])
|
||||||
|
m4_include([config/ltversion.m4])
|
||||||
|
m4_include([config/lt~obsolete.m4])
|
||||||
84
autogen.sh
Executable file
84
autogen.sh
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# clear up the mess
|
||||||
|
set -x
|
||||||
|
|
||||||
|
find . -name Makefile -exec rm {} \;
|
||||||
|
find . -name Makefile.in -exec rm {} \;
|
||||||
|
find . -name "*~" -exec rm {} \;
|
||||||
|
find . -name config.h -exec rm {} \;
|
||||||
|
find . -name stamp.h -exec rm {} \;
|
||||||
|
find . -name .deps -exec rm -rf {} \;
|
||||||
|
find . -name .libs -exec rm -rf {} \;
|
||||||
|
find . -name .o -exec rm -rf {} \;
|
||||||
|
find . -name .lo -exec rm -rf {} \;
|
||||||
|
|
||||||
|
rm -rf configure config.* config autom4te.cache tests/test* tests/v* tests/stresstest/*
|
||||||
|
set +x
|
||||||
|
|
||||||
|
# generate the install include file
|
||||||
|
(echo "#ifndef _HAVE_PCP"; echo "#define _HAVE_PCP"; echo) > include/pcp.h
|
||||||
|
(echo "#ifdef __cplusplus"; echo "extern \"C\" {"; echo "#endif"; echo) >> include/pcp.h
|
||||||
|
|
||||||
|
egrep -h "^#include" libpcp/*.h | grep -v '"' | sort -u >> include/pcp.h
|
||||||
|
|
||||||
|
egrep -l _PCP libpcp/*.h | while read include; do
|
||||||
|
(echo; echo "// +++ from $include: +++"; echo) >> include/pcp.h
|
||||||
|
grep -h -v _HAVE $include | egrep -v "^#include" >> include/pcp.h
|
||||||
|
done
|
||||||
|
|
||||||
|
(echo "#ifdef __cplusplus"; echo "}"; echo "#endif"; echo) >> include/pcp.h
|
||||||
|
(echo; echo "#endif") >> include/pcp.h
|
||||||
|
|
||||||
|
|
||||||
|
# generate the version file
|
||||||
|
maj=`egrep "#define PCP_VERSION_MAJOR" libpcp/version.h | awk '{print $3}'`
|
||||||
|
min=`egrep "#define PCP_VERSION_MINOR" libpcp/version.h | awk '{print $3}'`
|
||||||
|
pat=`egrep "#define PCP_VERSION_PATCH" libpcp/version.h | awk '{print $3}'`
|
||||||
|
echo "$maj.$min.$pat" > VERSION
|
||||||
|
|
||||||
|
# generate the manpage
|
||||||
|
echo "=head1 NAME
|
||||||
|
|
||||||
|
Pretty Curved Privacy - File encryption using eliptic curve cryptography.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
" > man/pcp1.pod
|
||||||
|
cat src/usage.txt | sed "s/^/ /g" >> man/pcp1.pod
|
||||||
|
cat man/pcp.pod >> man/pcp1.pod
|
||||||
|
cat man/details.pod >> man/pcp1.pod
|
||||||
|
cat man/footer.pod >> man/pcp1.pod
|
||||||
|
|
||||||
|
pod2man -r "PCP `cat VERSION`" -c "USER CONTRIBUTED DOCUMENTATION" man/pcp1.pod > man/pcp1.1
|
||||||
|
|
||||||
|
# generate the top level readme
|
||||||
|
cat man/pcp.pod man/install.pod man/footer.pod > README.pod
|
||||||
|
pod2text README.pod > README.txt
|
||||||
|
|
||||||
|
# generate usage.h
|
||||||
|
(cd src && ./usage.sh)
|
||||||
|
|
||||||
|
clean=$1
|
||||||
|
|
||||||
|
touch README
|
||||||
|
|
||||||
|
if test -z "$clean"; then
|
||||||
|
mkdir -p ./config
|
||||||
|
|
||||||
|
if ! command -v libtool >/dev/null 2>&1; then
|
||||||
|
echo "could not find libtool." 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v autoreconf >/dev/null 2>&1; then
|
||||||
|
echo "could not find autoreconf." 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
autoreconf --install --force --verbose -I config
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf autom4te.cache
|
||||||
|
|
||||||
|
rm -f README
|
||||||
342
config/compile
Executable file
342
config/compile
Executable file
@@ -0,0 +1,342 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2012-03-05.13; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2012 Free Software Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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 <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
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
|
||||||
|
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 <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.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: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
1407
config/config.guess
vendored
Executable file
1407
config/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1504
config/config.sub
vendored
Executable file
1504
config/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
780
config/depcomp
Executable file
780
config/depcomp
Executable file
@@ -0,0 +1,780 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2012-07-12.20; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2012 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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 <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
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 <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
# 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 informations.
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## 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).
|
||||||
|
## - 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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
|
## 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.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" |
|
||||||
|
## 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.
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
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
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
|
||||||
|
# However on
|
||||||
|
# $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
|
# ICC 7.0 will fill foo.d with something like
|
||||||
|
# foo.o: sub/foo.c
|
||||||
|
# foo.o: sub/foo.h
|
||||||
|
# which is wrong. We want
|
||||||
|
# sub/foo.o: sub/foo.c
|
||||||
|
# sub/foo.o: sub/foo.h
|
||||||
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\':
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
# tcc 0.9.26 (FIXME still under development at the moment of writing)
|
||||||
|
# will emit a similar output, but also prepend the continuation lines
|
||||||
|
# with horizontal tabulation characters.
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
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 -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \
|
||||||
|
< "$tmpdepfile" > "$depfile"
|
||||||
|
sed '
|
||||||
|
s/[ '"$tab"'][ '"$tab"']*/ /g
|
||||||
|
s/^ *//
|
||||||
|
s/ *\\*$//
|
||||||
|
s/^[^:]*: *//
|
||||||
|
/^$/d
|
||||||
|
/:$/d
|
||||||
|
s/$/ :/
|
||||||
|
' < "$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 ... \
|
||||||
|
# ...
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
# Use the source, not the object, to determine the base name, since
|
||||||
|
# that's sadly what pgcc will do too.
|
||||||
|
base=`echo "$source" | sed -e 's|^.*/||' -e 's/\.[-_a-zA-Z0-9]*$//'`
|
||||||
|
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; rm -rf $lockdir" 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.
|
||||||
|
rm -rf $lockdir
|
||||||
|
break
|
||||||
|
else
|
||||||
|
## 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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# 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.libs/$base.lo.d # libtool 1.4
|
||||||
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.o.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
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" = 0; then :
|
||||||
|
else
|
||||||
|
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"
|
||||||
|
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"
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
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"
|
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
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: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
527
config/install-sh
Executable file
527
config/install-sh
Executable file
@@ -0,0 +1,527 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2011-11-20.07; # 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.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
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
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
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
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
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
|
||||||
|
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 -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob 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` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob 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: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
7823
config/libtool.m4
vendored
Normal file
7823
config/libtool.m4
vendored
Normal file
File diff suppressed because it is too large
Load Diff
9687
config/ltmain.sh
Executable file
9687
config/ltmain.sh
Executable file
File diff suppressed because it is too large
Load Diff
369
config/ltoptions.m4
vendored
Normal file
369
config/ltoptions.m4
vendored
Normal file
@@ -0,0 +1,369 @@
|
|||||||
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008, 2009 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 7 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_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_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],
|
||||||
|
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
||||||
|
[pic_mode="$withval"],
|
||||||
|
[pic_mode=default])
|
||||||
|
|
||||||
|
test -z "$pic_mode" && 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])])
|
||||||
123
config/ltsugar.m4
vendored
Normal file
123
config/ltsugar.m4
vendored
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008 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
|
||||||
|
])
|
||||||
23
config/ltversion.m4
vendored
Normal file
23
config/ltversion.m4
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004 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 3293 ltversion.m4
|
||||||
|
# This file is part of GNU Libtool
|
||||||
|
|
||||||
|
m4_define([LT_PACKAGE_VERSION], [2.4])
|
||||||
|
m4_define([LT_PACKAGE_REVISION], [1.3293])
|
||||||
|
|
||||||
|
AC_DEFUN([LTVERSION_VERSION],
|
||||||
|
[macro_version='2.4'
|
||||||
|
macro_revision='1.3293'
|
||||||
|
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||||
|
_LT_DECL(, macro_revision, 0)
|
||||||
|
])
|
||||||
98
config/lt~obsolete.m4
vendored
Normal file
98
config/lt~obsolete.m4
vendored
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2009 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])])
|
||||||
330
config/missing
Executable file
330
config/missing
Executable file
@@ -0,0 +1,330 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
|
scriptversion=2012-01-06.18; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2012 Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
run=:
|
||||||
|
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||||
|
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||||
|
|
||||||
|
# In the cases where this matters, 'missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
--run)
|
||||||
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file 'aclocal.m4'
|
||||||
|
autoconf touch file 'configure'
|
||||||
|
autoheader touch file 'config.h.in'
|
||||||
|
autom4te touch the output file, or create a stub one
|
||||||
|
automake touch all 'Makefile.in' files
|
||||||
|
bison create 'y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create 'lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create 'lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
yacc create 'y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||||
|
'g' are ignored when checking the name.
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
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
|
||||||
|
|
||||||
|
# normalize program name to check for.
|
||||||
|
program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program). This is about non-GNU programs, so use $1 not
|
||||||
|
# $program.
|
||||||
|
case $1 in
|
||||||
|
lex*|yacc*)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
|
# We have it, but it failed.
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running '$TOOL --version' or '$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
|
# try to emulate it.
|
||||||
|
case $program in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'acinclude.m4' or '${configure_ac}'. You might want
|
||||||
|
to install the Automake and Perl packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified '${configure_ac}'. You might want to install the
|
||||||
|
Autoconf and GNU m4 packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'acconfig.h' or '${configure_ac}'. You might want
|
||||||
|
to install the Autoconf and GNU m4 packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case $f in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'.
|
||||||
|
You might want to install the Automake and Perl packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get '$1' as part of Autoconf from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison*|yacc*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' $msg. You should only need it if
|
||||||
|
you modified a '.y' file. You may need the Bison package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
Bison from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.h; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.c; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex*|flex*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a '.l' file. You may need the Flex package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
Flex from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f lex.yy.c; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
Help2man package in order for those modifications to take
|
||||||
|
effect. You can get Help2man from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a '.texi' or '.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy 'make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the Texinfo package or
|
||||||
|
the GNU make package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '
|
||||||
|
/^@setfilename/{
|
||||||
|
s/.* \([^ ]*\) *$/\1/
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the 'README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing '$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# 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: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
148
configure.ac
Executable file
148
configure.ac
Executable file
@@ -0,0 +1,148 @@
|
|||||||
|
# -*-sh-*-
|
||||||
|
AC_PREREQ(2.61)
|
||||||
|
AC_INIT(pcp, `cat VERSION`)
|
||||||
|
AC_CONFIG_AUX_DIR(config)
|
||||||
|
AC_CONFIG_MACRO_DIR(config)
|
||||||
|
|
||||||
|
AC_CONFIG_HEADER(libpcp/config.h)
|
||||||
|
AM_INIT_AUTOMAKE
|
||||||
|
|
||||||
|
|
||||||
|
ORIG_CFLAGS="${CFLAGS:-none}"
|
||||||
|
|
||||||
|
# Checks for programs
|
||||||
|
AC_PROG_CC
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
AC_PROG_SED
|
||||||
|
AC_PROG_AWK
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
# Allow user to specify flags
|
||||||
|
AC_ARG_WITH([cflags],
|
||||||
|
[ --with-cflags Specify additional flags to pass to compiler],
|
||||||
|
[
|
||||||
|
if test -n "$withval" && test "x$withval" != "xno" && \
|
||||||
|
test "x${withval}" != "xyes"; then
|
||||||
|
CFLAGS="$CFLAGS $withval"
|
||||||
|
fi
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH([ldflags],
|
||||||
|
[ --with-ldflags Specify additional flags to pass to linker],
|
||||||
|
[
|
||||||
|
if test -n "$withval" && test "x$withval" != "xno" && \
|
||||||
|
test "x${withval}" != "xyes"; then
|
||||||
|
LDFLAGS="$LDFLAGS $withval"
|
||||||
|
fi
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Host speciffic checks
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(errno.h err.h stdlib.h string.h unistd.h stdio.h getopt.h\
|
||||||
|
limits.h stddef.h stdint.h sys/types.h sys/stat.h termios.h)
|
||||||
|
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_CHECK_FUNCS( \
|
||||||
|
arc4random_buf \
|
||||||
|
fread \
|
||||||
|
fopen \
|
||||||
|
free \
|
||||||
|
fwrite \
|
||||||
|
fseek \
|
||||||
|
ftruncate \
|
||||||
|
fprintf \
|
||||||
|
isatty \
|
||||||
|
malloc \
|
||||||
|
memset \
|
||||||
|
memcpy \
|
||||||
|
perror \
|
||||||
|
strnlen \
|
||||||
|
strlen \
|
||||||
|
strtol \
|
||||||
|
sizeof \
|
||||||
|
tcgetattr \
|
||||||
|
umask
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([compiler and flags for sanity])
|
||||||
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h> ]], [[ exit(0); ]])],
|
||||||
|
[ AC_MSG_RESULT([yes]) ],
|
||||||
|
[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
AC_MSG_ERROR([*** compiler cannot create working executables, check config.log ***])
|
||||||
|
],
|
||||||
|
[ AC_MSG_WARN([cross compiling: not checking compiler sanity]) ]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Check for some target-specific stuff
|
||||||
|
case "$host" in
|
||||||
|
*-*-aix*) ;;
|
||||||
|
*-*-android*) ;;
|
||||||
|
*-*-cygwin*) ;;
|
||||||
|
*-*-dgux*) ;;
|
||||||
|
*-*-darwin*) ;;
|
||||||
|
*-*-dragonfly*) ;;
|
||||||
|
*-*-haiku*) ;;
|
||||||
|
*-*-hpux*) ;;
|
||||||
|
*-*-irix5*) ;;
|
||||||
|
*-*-irix6*) ;;
|
||||||
|
*-*-k*bsd*-gnu | *-*-kopensolaris*-gnu) ;;
|
||||||
|
*-*-linux*) ;;
|
||||||
|
*-*-netbsd*) ;;
|
||||||
|
*-*-freebsd*)
|
||||||
|
# ports install to /usr/local by default, check
|
||||||
|
if test -d "/usr/local/lib" -a -d "/usr/local/include"; then
|
||||||
|
CFLAGS="$CFLAGS -I/usr/local/include"
|
||||||
|
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*-*-bsdi*) ;;
|
||||||
|
*-next-*) ;;
|
||||||
|
*-*-openbsd*) ;;
|
||||||
|
*-*-solaris*) ;;
|
||||||
|
*-*-sunos4*) ;;
|
||||||
|
*-ncr-sysv*) ;;
|
||||||
|
*-sni-sysv*) ;;
|
||||||
|
*-*-sysv4.2*) ;;
|
||||||
|
*-*-sysv5*) ;;
|
||||||
|
*-*-sysv*) ;;
|
||||||
|
*-*-sco*) ;;
|
||||||
|
*-*-unicos*) ;;
|
||||||
|
*-dec-osf*) ;;
|
||||||
|
*-*-nto-qnx*) ;;
|
||||||
|
*-*-ultrix*) ;;
|
||||||
|
*-*-lynxos) ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_CHECK_LIB(sodium, sodium_init, , [AC_MSG_ERROR([cannot link with -lsodium, install libsodium.])])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([is libsodium compiled correctly])
|
||||||
|
AC_RUN_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([[
|
||||||
|
#include <sodium.h>
|
||||||
|
#if crypto_box_PUBLICKEYBYTES != 32 || crypto_box_SECRETKEYBYTES != 32 || crypto_sign_PUBLICKEYBYTES != 32 || crypto_sign_PUBLICKEYBYTES != 32
|
||||||
|
# error "libsodium not built correctly"
|
||||||
|
#endif
|
||||||
|
]],[[exit(0);]])],
|
||||||
|
[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
],
|
||||||
|
[
|
||||||
|
AC_MSG_ERROR([no. please check your libsodium installation, consider re-installing])
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Specify output files
|
||||||
|
AC_CONFIG_FILES([Makefile libpcp/Makefile src/Makefile man/Makefile tests/Makefile])
|
||||||
|
AC_OUTPUT
|
||||||
502
include/pcp.h
Normal file
502
include/pcp.h
Normal file
@@ -0,0 +1,502 @@
|
|||||||
|
#ifndef _HAVE_PCP
|
||||||
|
#define _HAVE_PCP
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <inttypes.h> /* uint32_t */
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <stddef.h> /* ptrdiff_t */
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdlib.h> /* exit() */
|
||||||
|
#include <string.h>
|
||||||
|
#include <string.h> /* memcmp,strlen */
|
||||||
|
#include <strings.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
|
#include <sys/endian.h> // FIXME: put portable thing from scrypt here
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include CONFIG_H_FILE
|
||||||
|
|
||||||
|
// +++ from libpcp/crypto.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t pcp_sodium_box(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *secret,
|
||||||
|
unsigned char *public);
|
||||||
|
|
||||||
|
int pcp_sodium_verify_box(unsigned char **cleartext, unsigned char* message,
|
||||||
|
size_t messagesize, unsigned char *nonce,
|
||||||
|
unsigned char *secret, unsigned char *public);
|
||||||
|
|
||||||
|
unsigned char *pcp_box_encrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *message, size_t messagesize,
|
||||||
|
size_t *csize);
|
||||||
|
|
||||||
|
unsigned char *pcp_box_decrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *cipher, size_t ciphersize,
|
||||||
|
size_t *dsize);
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/getpass.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (unportable) functions to turn on/off terminal echo
|
||||||
|
* using termios functions. might compile however on
|
||||||
|
* most unices, tested on FreeBSD only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_echo_off();
|
||||||
|
void pcp_echo_on();
|
||||||
|
char *pcp_get_stdin();
|
||||||
|
char *pcp_get_passphrase(char *prompt);
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/key.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
PCP private key structure. Most fields are self explanatory.
|
||||||
|
Some notes:
|
||||||
|
|
||||||
|
'encrypted' contains the encrypted secret key. If it's set,
|
||||||
|
the field 'secret' which contains the clear secret key will
|
||||||
|
be zeroed with random values, the first byte will be 0.
|
||||||
|
|
||||||
|
'nonce' contains the nonce required to decrypt the encrypted
|
||||||
|
secret, if set.
|
||||||
|
|
||||||
|
'serial' is a random number.
|
||||||
|
|
||||||
|
'id' is a string containing the hex values of the CRC32 checksum
|
||||||
|
of the public and secret key.
|
||||||
|
|
||||||
|
Upon creation everything will be filled with random bytes.
|
||||||
|
String fields will contain a string followed by 0 followed
|
||||||
|
by the rest of the pre-filled random bytes. To denote a string
|
||||||
|
field as empty, the first byte will be set to 0.
|
||||||
|
|
||||||
|
There are dynamically calculated attributes as well:
|
||||||
|
|
||||||
|
'checksum' is a 256 bit SHA hash of the public key returned
|
||||||
|
by pcpkey_getchecksum() or pcppubkey_getchecksum().
|
||||||
|
|
||||||
|
'random id' is a random art ascii image returned by
|
||||||
|
pcppubkey_get_art() or pcpkey_get_art(), calculated from
|
||||||
|
the public key.
|
||||||
|
|
||||||
|
If exported to a single file or printed, the structure will
|
||||||
|
be encoded using Z85 encoding.
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct _pcp_key_t {
|
||||||
|
byte public[32];
|
||||||
|
byte secret[32];
|
||||||
|
byte nonce[24];
|
||||||
|
byte encrypted[48];
|
||||||
|
char owner[255];
|
||||||
|
char mail[255];
|
||||||
|
char id[17];
|
||||||
|
long ctime;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t serial;
|
||||||
|
uint8_t type;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _pcp_pubkey_t {
|
||||||
|
byte public[32];
|
||||||
|
char owner[255];
|
||||||
|
char mail[255];
|
||||||
|
char id[17];
|
||||||
|
long ctime;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t serial;
|
||||||
|
uint8_t type;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _pcp_key_t pcp_key_t;
|
||||||
|
typedef struct _pcp_pubkey_t pcp_pubkey_t;
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_hash;
|
||||||
|
pcp_pubkey_t *pcppubkey_hash;
|
||||||
|
|
||||||
|
void pcp_cleanhashes();
|
||||||
|
pcp_key_t *pcpkey_new ();
|
||||||
|
|
||||||
|
char *pcppubkey_get_art(pcp_pubkey_t *k);
|
||||||
|
char *pcpkey_get_art(pcp_key_t *k);
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_encrypt(pcp_key_t *key, char *passphrase);
|
||||||
|
pcp_key_t *pcpkey_decrypt(pcp_key_t *key, char *passphrase);
|
||||||
|
pcp_pubkey_t *pcpkey_pub_from_secret(pcp_key_t *key);
|
||||||
|
char *pcp_getkeyid(pcp_key_t *k);
|
||||||
|
unsigned char *pcppubkey_getchecksum(pcp_pubkey_t *k);
|
||||||
|
unsigned char *pcpkey_getchecksum(pcp_key_t *k);
|
||||||
|
void pcp_inithashes();
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_exists(char *id);
|
||||||
|
pcp_pubkey_t *pcppubkey_exists(char *id);
|
||||||
|
|
||||||
|
pcp_key_t * key2be(pcp_key_t *k);
|
||||||
|
pcp_key_t *key2native(pcp_key_t *k);
|
||||||
|
pcp_pubkey_t * pubkey2be(pcp_pubkey_t *k);
|
||||||
|
pcp_pubkey_t *pubkey2native(pcp_pubkey_t *k);
|
||||||
|
|
||||||
|
unsigned char * pcp_gennonce();
|
||||||
|
|
||||||
|
void pcpedit_key(char *keyid);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/mac.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// how many times do we hash the passphrase
|
||||||
|
#define HCYCLES 128000
|
||||||
|
|
||||||
|
// encrypt some arbitrary cleartext using
|
||||||
|
// a curve25519 secret key and a given nonce.
|
||||||
|
//
|
||||||
|
// expects a pointer to the target binary
|
||||||
|
// stream containing the encrypted data,
|
||||||
|
// the cleartext string, its size, the nonce
|
||||||
|
// (24 bytes) and the secret key (32 bytes).
|
||||||
|
//
|
||||||
|
// allocates memory for the returned cipher
|
||||||
|
// and it is up to the user to free it after use.
|
||||||
|
//
|
||||||
|
// returns the size of the returned cipherstream.
|
||||||
|
// in case of an error, the cipher will be set
|
||||||
|
// to NULL.
|
||||||
|
size_t pcp_sodium_mac(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *key);
|
||||||
|
|
||||||
|
// does the opposite of pcp_sodium_mac and decrypts
|
||||||
|
// a given encrypted binary stream using a nonce and
|
||||||
|
// a secret key (sizes: see above).
|
||||||
|
//
|
||||||
|
// allocates memory for the returned cleartext and
|
||||||
|
// it is up to the user to free it after use.
|
||||||
|
//
|
||||||
|
// returns 0 if decryption and verification were
|
||||||
|
// successful, otherwise -1.
|
||||||
|
int pcp_sodium_verify_mac(unsigned char **cleartext,
|
||||||
|
unsigned char* message,
|
||||||
|
size_t messagesize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *key);
|
||||||
|
|
||||||
|
// generate a nonce from random source arc4random().
|
||||||
|
// allocates memory for the returned nonce and
|
||||||
|
// it is up to the user to free it after use.
|
||||||
|
void pcp_makenonce(unsigned char **nonce);
|
||||||
|
|
||||||
|
// proprietary key derivation function. derives an
|
||||||
|
// secure encryption key from the given passphrase by
|
||||||
|
// calculating a SALSA20 hash from it HCYCLES times.
|
||||||
|
//
|
||||||
|
// turns the result into a proper CURVE25519 secret
|
||||||
|
// key. allocates memory for key and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// deprecation warning: maybe removed once the libsodium
|
||||||
|
// developers incorporated some key derivation function
|
||||||
|
// into libsodium. so far, there's none but word goes
|
||||||
|
// that perhaps something like scrypt() from the star
|
||||||
|
// distribution may be added in the future.
|
||||||
|
unsigned char *pcp_derivekey(char *passphrase);
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/mem.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// simple malloc() wrapper
|
||||||
|
// behaves like calloc(), which
|
||||||
|
// I don't have here.
|
||||||
|
//
|
||||||
|
// exits if there's no more memory
|
||||||
|
// available.
|
||||||
|
void *ucmalloc(size_t s);
|
||||||
|
|
||||||
|
// the same but it fills the pointer with random values
|
||||||
|
void *urmalloc(size_t s);
|
||||||
|
|
||||||
|
// dito.
|
||||||
|
void *ucfree(void *ptr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/pad.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define ZPADCHAR 48
|
||||||
|
#else
|
||||||
|
#define ZPADCHAR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// prepends a binary stream with a number of
|
||||||
|
// \0's as required by the secret_box and
|
||||||
|
// secret_box_open functions of libsodium.
|
||||||
|
//
|
||||||
|
// parameters:
|
||||||
|
//
|
||||||
|
// padded: destination array (ref)
|
||||||
|
// unpadded: source array without padding
|
||||||
|
// padlen: length of padding
|
||||||
|
// unpadlen: length of source array
|
||||||
|
//
|
||||||
|
// turns "efa5" into "00000000efa5" with padlen 8
|
||||||
|
//
|
||||||
|
// if DEBUG is set, destination will be padded with
|
||||||
|
// the character '0', NOT the integer 0.
|
||||||
|
//
|
||||||
|
// allocates memory for padded and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// sample call:
|
||||||
|
//
|
||||||
|
// char unpadded[] = {0xef, 0xa5};
|
||||||
|
// unsigned char *padded;
|
||||||
|
// pcp_pad_prepend(&padded, unpadded, 8, 2);
|
||||||
|
//
|
||||||
|
// the result, padded, would be 10 bytes long, 8
|
||||||
|
// bytes for the leading zeros and 2 for the content
|
||||||
|
// of the original unpadded.
|
||||||
|
void pcp_pad_prepend(unsigned char **padded, unsigned char *unpadded,
|
||||||
|
size_t padlen, size_t unpadlen);
|
||||||
|
|
||||||
|
// removes zero's of a binary stream, which is
|
||||||
|
// the reverse of pcp_pad_prepend().
|
||||||
|
//
|
||||||
|
// parameters:
|
||||||
|
//
|
||||||
|
// unpadded: destination array (ref), with padding removed
|
||||||
|
// padded: source array with padding
|
||||||
|
// padlen: length of padding
|
||||||
|
// unpadlen: length of source array
|
||||||
|
//
|
||||||
|
// turns "00000000efa5" into "efa5" with padlen 8
|
||||||
|
//
|
||||||
|
// allocates memory for unpadded and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// sample call:
|
||||||
|
//
|
||||||
|
// char padded[] = {0x0, 0x0, 0x0, 0x0, 0xef, 0xa5};
|
||||||
|
// unsigned char *unpadded;
|
||||||
|
// pcp_pad_remove(unpadded, padded, 4, 2);
|
||||||
|
//
|
||||||
|
// the result, unpadded would be 2 bytes long containing
|
||||||
|
// only the 2 bytes we want to have with zeros removed.
|
||||||
|
void pcp_pad_remove(unsigned char **unpadded, unsigned char *padded,
|
||||||
|
size_t padlen, size_t unpadlen);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/platform.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_H_FILE)
|
||||||
|
#elif defined(HAVE_CONFIG_H)
|
||||||
|
#else
|
||||||
|
#error Need either CONFIG_H_FILE or HAVE_CONFIG_H defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/randomart.h: +++
|
||||||
|
|
||||||
|
/* $OpenBSD: key.c,v 1.70 2008/06/11 21:01:35 grunk Exp $ */
|
||||||
|
/*
|
||||||
|
* read_bignum():
|
||||||
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
*
|
||||||
|
* As far as I am concerned, the code I have written for this software
|
||||||
|
* can be used freely for any purpose. Any derived versions of this
|
||||||
|
* software must be clearly marked as such, and if the derived work is
|
||||||
|
* incompatible with the protocol description in the RFC file, it must be
|
||||||
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (c) 2000, 2001 Markus Friedl. 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key_fingerprint_randomart comitted by Alexander von Gernler in rev 1.70
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// from openssh key.c
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
# define MAX(a,b) (((a)>(b))?(a):(b))
|
||||||
|
# define MIN(a,b) (((a)<(b))?(a):(b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
char *key_fingerprint_randomart(unsigned char *dgst_raw, unsigned int dgst_raw_len);
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/vault.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct _vault_t {
|
||||||
|
char *filename;
|
||||||
|
FILE *fd;
|
||||||
|
uint8_t unsafed;
|
||||||
|
uint8_t isnew;
|
||||||
|
uint32_t size;
|
||||||
|
time_t modified;
|
||||||
|
mode_t mode;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _vault_header_t {
|
||||||
|
byte fileid;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _vault_item_header_t {
|
||||||
|
byte type;
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _vault_t vault_t;
|
||||||
|
typedef struct _vault_header_t vault_header_t;
|
||||||
|
typedef struct _vault_item_header_t vault_item_header_t;
|
||||||
|
|
||||||
|
vault_t *pcpvault_init(char *filename);
|
||||||
|
vault_t *pcpvault_new(char *filename, int is_tmp);
|
||||||
|
int pcpvault_create(vault_t *vault);
|
||||||
|
int pcpvault_additem(vault_t *vault, void *item, size_t itemsize, uint8_t type, uint8_t do_hash);
|
||||||
|
int pcpvault_close(vault_t *vault);
|
||||||
|
int pcpvault_fetchall(vault_t *vault);
|
||||||
|
int pcpvault_writeall(vault_t *vault);
|
||||||
|
void pcpvault_copy(vault_t *tmp, vault_t *vault);
|
||||||
|
void pcpvault_unlink(vault_t *tmp);
|
||||||
|
unsigned char *pcpvault_create_checksum(vault_t *vault);
|
||||||
|
void pcpvault_update_checksum(vault_t *vault);
|
||||||
|
|
||||||
|
vault_header_t * vh2be(vault_header_t *h);
|
||||||
|
vault_header_t * vh2native(vault_header_t *h);
|
||||||
|
vault_item_header_t * ih2be(vault_item_header_t *h);
|
||||||
|
vault_item_header_t * ih2native(vault_item_header_t *h);
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/version.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
#define PCP_VERSION_MAJOR 0
|
||||||
|
#define PCP_VERSION_MINOR 0
|
||||||
|
#define PCP_VERSION_PATCH 1
|
||||||
|
|
||||||
|
#define PCP_MAKE_VERSION(major, minor, patch) \
|
||||||
|
((major) * 10000 + (minor) * 100 + (patch))
|
||||||
|
#define PCP_VERSION \
|
||||||
|
PCP_MAKE_VERSION(PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH)
|
||||||
|
|
||||||
|
int pcp_version();
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/warn.h: +++
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_ERR_H
|
||||||
|
#else
|
||||||
|
#define NEED_WARN_PROGNAME
|
||||||
|
const char * warn_progname;
|
||||||
|
void warn(const char *, ...);
|
||||||
|
void warnx(const char *, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// +++ from libpcp/z85.h: +++
|
||||||
|
|
||||||
|
// from https://github.com/tlinden/curve-keygen/
|
||||||
|
|
||||||
|
|
||||||
|
// convert a binary stream to one which gets accepted by zmq_z85_encode
|
||||||
|
// we pad it with zeroes and put the number of zerores in front of it
|
||||||
|
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
// the reverse of the above
|
||||||
|
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
// wrapper around zmq Z85 encoding function
|
||||||
|
unsigned char *pcp_z85_decode(char *z85block, size_t *dstlen);
|
||||||
|
|
||||||
|
// the reverse of the above
|
||||||
|
char *pcp_z85_encode(unsigned char *raw, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
char *pcp_readz85file(FILE *infile);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
10
libpcp/Makefile.am
Normal file
10
libpcp/Makefile.am
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libpcp1.la
|
||||||
|
|
||||||
|
libpcp1_la_SOURCES = mac.c mem.c pad.c version.c warn.c \
|
||||||
|
z85.c zmq_z85.c key.c randomart.c \
|
||||||
|
vault.c fatal.c jenhash.c digital_crc32.c \
|
||||||
|
crypto.c
|
||||||
|
|
||||||
|
include_HEADERS = ../include/pcp.h
|
||||||
630
libpcp/Makefile.in
Normal file
630
libpcp/Makefile.in
Normal file
@@ -0,0 +1,630 @@
|
|||||||
|
# Makefile.in generated by automake 1.12.4 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2012 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__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
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 = libpcp
|
||||||
|
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
||||||
|
$(top_srcdir)/config/depcomp
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
|
||||||
|
$(top_srcdir)/config/ltoptions.m4 \
|
||||||
|
$(top_srcdir)/config/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/config/ltversion.m4 \
|
||||||
|
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
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)$(includedir)"
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
libpcp1_la_LIBADD =
|
||||||
|
am_libpcp1_la_OBJECTS = mac.lo mem.lo pad.lo version.lo warn.lo z85.lo \
|
||||||
|
zmq_z85.lo key.lo randomart.lo vault.lo fatal.lo jenhash.lo \
|
||||||
|
digital_crc32.lo crypto.lo
|
||||||
|
libpcp1_la_OBJECTS = $(am_libpcp1_la_OBJECTS)
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||||
|
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(libpcp1_la_SOURCES)
|
||||||
|
DIST_SOURCES = $(libpcp1_la_SOURCES)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
HEADERS = $(include_HEADERS)
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
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@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
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@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
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@
|
||||||
|
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@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
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@
|
||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
lib_LTLIBRARIES = libpcp1.la
|
||||||
|
libpcp1_la_SOURCES = mac.c mem.c pad.c version.c warn.c \
|
||||||
|
z85.c zmq_z85.c key.c randomart.c \
|
||||||
|
vault.c fatal.c jenhash.c digital_crc32.c \
|
||||||
|
crypto.c
|
||||||
|
|
||||||
|
include_HEADERS = ../include/pcp.h
|
||||||
|
all: config.h
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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) --gnu libpcp/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu libpcp/Makefile
|
||||||
|
.PRECIOUS: 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_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
config.h: stamp-h1
|
||||||
|
@if test ! -f $@; then rm -f stamp-h1; else :; fi
|
||||||
|
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
|
||||||
|
|
||||||
|
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||||
|
@rm -f stamp-h1
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status libpcp/config.h
|
||||||
|
$(srcdir)/config.h.in: $(am__configure_deps)
|
||||||
|
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||||
|
rm -f stamp-h1
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
distclean-hdr:
|
||||||
|
-rm -f config.h stamp-h1
|
||||||
|
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}; \
|
||||||
|
}
|
||||||
|
libpcp1.la: $(libpcp1_la_OBJECTS) $(libpcp1_la_DEPENDENCIES) $(EXTRA_libpcp1_la_DEPENDENCIES)
|
||||||
|
$(LINK) -rpath $(libdir) $(libpcp1_la_OBJECTS) $(libpcp1_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digital_crc32.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatal.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jenhash.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pad.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randomart.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vault.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/warn.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/z85.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zmq_z85.Plo@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
install-includeHEADERS: $(include_HEADERS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(includedir)" || 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)$(includedir)'"; \
|
||||||
|
$(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-includeHEADERS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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"
|
||||||
|
|
||||||
|
cscopelist: $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP)'; \
|
||||||
|
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
|
||||||
|
|
||||||
|
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 $(LTLIBRARIES) $(HEADERS) config.h
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; 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-libLTLIBRARIES clean-libtool \
|
||||||
|
mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-hdr distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-includeHEADERS
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am: install-libLTLIBRARIES
|
||||||
|
|
||||||
|
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 -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
.MAKE: all install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||||
|
clean-libLTLIBRARIES clean-libtool cscopelist ctags distclean \
|
||||||
|
distclean-compile distclean-generic distclean-hdr \
|
||||||
|
distclean-libtool distclean-tags 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-includeHEADERS install-info install-info-am \
|
||||||
|
install-libLTLIBRARIES 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-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags uninstall uninstall-am uninstall-includeHEADERS \
|
||||||
|
uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
149
libpcp/config.h.in
Normal file
149
libpcp/config.h.in
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
/* libpcp/config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `arc4random_buf' function. */
|
||||||
|
#undef HAVE_ARC4RANDOM_BUF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
|
#undef HAVE_DLFCN_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <errno.h> header file. */
|
||||||
|
#undef HAVE_ERRNO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <err.h> header file. */
|
||||||
|
#undef HAVE_ERR_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fopen' function. */
|
||||||
|
#undef HAVE_FOPEN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fprintf' function. */
|
||||||
|
#undef HAVE_FPRINTF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fread' function. */
|
||||||
|
#undef HAVE_FREAD
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `free' function. */
|
||||||
|
#undef HAVE_FREE
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fseek' function. */
|
||||||
|
#undef HAVE_FSEEK
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `ftruncate' function. */
|
||||||
|
#undef HAVE_FTRUNCATE
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fwrite' function. */
|
||||||
|
#undef HAVE_FWRITE
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <getopt.h> header file. */
|
||||||
|
#undef HAVE_GETOPT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isatty' function. */
|
||||||
|
#undef HAVE_ISATTY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `sodium' library (-lsodium). */
|
||||||
|
#undef HAVE_LIBSODIUM
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <limits.h> header file. */
|
||||||
|
#undef HAVE_LIMITS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `malloc' function. */
|
||||||
|
#undef HAVE_MALLOC
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `memcpy' function. */
|
||||||
|
#undef HAVE_MEMCPY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `memset' function. */
|
||||||
|
#undef HAVE_MEMSET
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `perror' function. */
|
||||||
|
#undef HAVE_PERROR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `sizeof' function. */
|
||||||
|
#undef HAVE_SIZEOF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stddef.h> header file. */
|
||||||
|
#undef HAVE_STDDEF_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdio.h> header file. */
|
||||||
|
#undef HAVE_STDIO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strlen' function. */
|
||||||
|
#undef HAVE_STRLEN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strnlen' function. */
|
||||||
|
#undef HAVE_STRNLEN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strtol' function. */
|
||||||
|
#undef HAVE_STRTOL
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `tcgetattr' function. */
|
||||||
|
#undef HAVE_TCGETATTR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <termios.h> header file. */
|
||||||
|
#undef HAVE_TERMIOS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `umask' function. */
|
||||||
|
#undef HAVE_UMASK
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||||
|
*/
|
||||||
|
#undef LT_OBJDIR
|
||||||
|
|
||||||
|
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||||
|
#undef NO_MINUS_C_MINUS_O
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
||||||
133
libpcp/crypto.c
Normal file
133
libpcp/crypto.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#include "crypto.h"
|
||||||
|
|
||||||
|
size_t pcp_sodium_box(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *secret,
|
||||||
|
unsigned char *public) {
|
||||||
|
|
||||||
|
unsigned char *pad_clear;
|
||||||
|
unsigned char *pad_cipher;
|
||||||
|
|
||||||
|
size_t ciphersize = (clearsize + crypto_box_ZEROBYTES) - crypto_box_BOXZEROBYTES; // $s + 32 -16
|
||||||
|
|
||||||
|
pad_cipher = ucmalloc(crypto_box_ZEROBYTES + clearsize);
|
||||||
|
pcp_pad_prepend(&pad_clear, cleartext, crypto_box_ZEROBYTES, clearsize);
|
||||||
|
|
||||||
|
// crypto_box(c,m,mlen,n,pk,sk);
|
||||||
|
crypto_box(pad_cipher, pad_clear,
|
||||||
|
clearsize + crypto_box_ZEROBYTES, nonce, public, secret);
|
||||||
|
|
||||||
|
pcp_pad_remove(cipher, pad_cipher, crypto_secretbox_BOXZEROBYTES, ciphersize);
|
||||||
|
|
||||||
|
free(pad_clear);
|
||||||
|
free(pad_cipher);
|
||||||
|
|
||||||
|
return ciphersize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int pcp_sodium_verify_box(unsigned char **cleartext, unsigned char* message,
|
||||||
|
size_t messagesize, unsigned char *nonce,
|
||||||
|
unsigned char *secret, unsigned char *public) {
|
||||||
|
// verify/decrypt the box
|
||||||
|
unsigned char *pad_cipher;
|
||||||
|
unsigned char *pad_clear;
|
||||||
|
int success = -1;
|
||||||
|
|
||||||
|
pcp_pad_prepend(&pad_cipher, message, crypto_box_BOXZEROBYTES, messagesize);
|
||||||
|
pad_clear = (unsigned char *)ucmalloc((crypto_box_ZEROBYTES+ messagesize));
|
||||||
|
|
||||||
|
// crypto_box_open(m,c,clen,n,pk,sk);
|
||||||
|
if (crypto_box_open(pad_clear, pad_cipher,
|
||||||
|
messagesize + crypto_box_BOXZEROBYTES,
|
||||||
|
nonce, public, secret) == 0) {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pad_remove(cleartext, pad_clear, crypto_box_ZEROBYTES, messagesize);
|
||||||
|
|
||||||
|
free(pad_clear);
|
||||||
|
free(pad_cipher);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char *pcp_box_encrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *message, size_t messagesize,
|
||||||
|
size_t *csize) {
|
||||||
|
|
||||||
|
unsigned char *nonce = pcp_gennonce();
|
||||||
|
unsigned char *cipher;
|
||||||
|
|
||||||
|
size_t es = pcp_sodium_box(&cipher, message, messagesize, nonce,
|
||||||
|
secret->secret, public->public);
|
||||||
|
|
||||||
|
if(es <= messagesize) {
|
||||||
|
fatal("failed to encrypt message!\n");
|
||||||
|
goto errbec;
|
||||||
|
}
|
||||||
|
|
||||||
|
// put nonce and cipher together
|
||||||
|
unsigned char *combined = ucmalloc(es + crypto_secretbox_NONCEBYTES);
|
||||||
|
memcpy(combined, nonce, crypto_secretbox_NONCEBYTES);
|
||||||
|
memcpy(&combined[crypto_secretbox_NONCEBYTES], cipher, es);
|
||||||
|
|
||||||
|
free(cipher);
|
||||||
|
free(nonce);
|
||||||
|
|
||||||
|
*csize = es + crypto_secretbox_NONCEBYTES;
|
||||||
|
|
||||||
|
return combined;
|
||||||
|
|
||||||
|
errbec:
|
||||||
|
if(cipher != NULL)
|
||||||
|
free(cipher);
|
||||||
|
free(nonce);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char *pcp_box_decrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *cipher, size_t ciphersize,
|
||||||
|
size_t *dsize) {
|
||||||
|
|
||||||
|
unsigned char *message = NULL;
|
||||||
|
|
||||||
|
unsigned char *nonce = ucmalloc(crypto_secretbox_NONCEBYTES);
|
||||||
|
unsigned char *cipheronly = ucmalloc(ciphersize - crypto_secretbox_NONCEBYTES);
|
||||||
|
|
||||||
|
memcpy(nonce, cipher, crypto_secretbox_NONCEBYTES);
|
||||||
|
memcpy(cipheronly, &cipher[crypto_secretbox_NONCEBYTES],
|
||||||
|
ciphersize - crypto_secretbox_NONCEBYTES);
|
||||||
|
|
||||||
|
if(pcp_sodium_verify_box(&message, cipheronly,
|
||||||
|
ciphersize - crypto_secretbox_NONCEBYTES,
|
||||||
|
nonce, secret->secret, public->public) != 0){
|
||||||
|
fatal("failed to decrypt message!\n");
|
||||||
|
goto errbed;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(nonce);
|
||||||
|
free(cipheronly);
|
||||||
|
|
||||||
|
// resulting size:
|
||||||
|
// ciphersize - crypto_secretbox_ZEROBYTES
|
||||||
|
*dsize = ciphersize - crypto_secretbox_ZEROBYTES;
|
||||||
|
return message;
|
||||||
|
|
||||||
|
errbed:
|
||||||
|
free(nonce);
|
||||||
|
free(cipheronly);
|
||||||
|
if(message != NULL)
|
||||||
|
free(message);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
33
libpcp/crypto.h
Normal file
33
libpcp/crypto.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef _HAVE_PCP_CRYPTO_H
|
||||||
|
#define _HAVE_PCP_CRYPTO_H
|
||||||
|
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "mem.h"
|
||||||
|
#include "key.h"
|
||||||
|
|
||||||
|
size_t pcp_sodium_box(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *secret,
|
||||||
|
unsigned char *public);
|
||||||
|
|
||||||
|
int pcp_sodium_verify_box(unsigned char **cleartext, unsigned char* message,
|
||||||
|
size_t messagesize, unsigned char *nonce,
|
||||||
|
unsigned char *secret, unsigned char *public);
|
||||||
|
|
||||||
|
unsigned char *pcp_box_encrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *message, size_t messagesize,
|
||||||
|
size_t *csize);
|
||||||
|
|
||||||
|
unsigned char *pcp_box_decrypt(pcp_key_t *secret, pcp_pubkey_t *public,
|
||||||
|
unsigned char *cipher, size_t ciphersize,
|
||||||
|
size_t *dsize);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_CRYPTO_H
|
||||||
50
libpcp/defines.h
Normal file
50
libpcp/defines.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#ifndef _DEFINES_H
|
||||||
|
#define _DEFINES_H
|
||||||
|
|
||||||
|
typedef unsigned char byte; // Single unsigned byte = 8 bits
|
||||||
|
typedef unsigned short dbyte; // Double byte = 16 bits
|
||||||
|
typedef unsigned int qbyte; // Quad byte = 32 bits
|
||||||
|
|
||||||
|
// key stuff
|
||||||
|
#define PCP_KEY_HEADER "----- BEGIN PCP SECRET KEY -----"
|
||||||
|
#define PCP_KEY_FOOTER "------ END PCP SECRET KEY ------"
|
||||||
|
|
||||||
|
#define PCP_PUBKEY_HEADER "----- BEGIN PCP PUBLIC KEY -----"
|
||||||
|
#define PCP_PUBKEY_FOOTER "------ END PCP PUBLICKEY ------"
|
||||||
|
|
||||||
|
#define PCP_ENFILE_HEADER "----- BEGIN PCP ENCRYPTED FILE -----"
|
||||||
|
#define PCP_ENFILE_FOOTER "------ END PCP ENCRYPTED FILE ------"
|
||||||
|
|
||||||
|
#define PCP_ZFILE_HEADER "----- BEGIN Z85 ENCODED FILE -----"
|
||||||
|
#define PCP_ZFILE_FOOTER "------ END Z85 ENCODED FILE ------"
|
||||||
|
|
||||||
|
#define PCP_ME "Pretty Curved Privacy"
|
||||||
|
|
||||||
|
#define PCP_KEY_VERSION 0x00000001U
|
||||||
|
#define PCP_KEY_PRIMITIVE "CURVE25519-ED25519-SALSA20-POLY1305"
|
||||||
|
|
||||||
|
#define PCP_KEY_TYPE_MAINSECRET 0x01
|
||||||
|
#define PCP_KEY_TYPE_SECRET 0x02
|
||||||
|
#define PCP_KEY_TYPE_PUBLIC 0x03
|
||||||
|
|
||||||
|
// how many times do we hash a passphrase
|
||||||
|
#define HCYCLES 128000
|
||||||
|
|
||||||
|
// save typing, dammit
|
||||||
|
#define PCP_ENCRYPT_PAD crypto_secretbox_ZEROBYTES + crypto_secretbox_NONCEBYTES
|
||||||
|
|
||||||
|
// vault id
|
||||||
|
#define PCP_VAULT_ID 0xC4
|
||||||
|
#define PCP_VAULT_VERSION 0x01
|
||||||
|
|
||||||
|
char *PCP_ERR;
|
||||||
|
byte PCP_ERRSET;
|
||||||
|
int PCP_EXIT;
|
||||||
|
|
||||||
|
//set error
|
||||||
|
void fatal(const char * fmt, ...);
|
||||||
|
|
||||||
|
// fetch error
|
||||||
|
void fatals_ifany();
|
||||||
|
|
||||||
|
#endif // _DEFINES_H
|
||||||
119
libpcp/digital_crc32.c
Normal file
119
libpcp/digital_crc32.c
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2005,2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Radio
|
||||||
|
*
|
||||||
|
* GNU Radio 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, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* GNU Radio is distributed in the hope that 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 GNU Radio; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See also ISO 3309 [ISO-3309] or ITU-T V.42 [ITU-V42] for a formal specification.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
#include <digital_crc32.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Automatically generated CRC function
|
||||||
|
// polynomial: 0x104C11DB7
|
||||||
|
unsigned int
|
||||||
|
digital_update_crc32(unsigned int crc, const unsigned char *data, size_t len)
|
||||||
|
{
|
||||||
|
static const unsigned int table[256] = {
|
||||||
|
0x00000000U,0x04C11DB7U,0x09823B6EU,0x0D4326D9U,
|
||||||
|
0x130476DCU,0x17C56B6BU,0x1A864DB2U,0x1E475005U,
|
||||||
|
0x2608EDB8U,0x22C9F00FU,0x2F8AD6D6U,0x2B4BCB61U,
|
||||||
|
0x350C9B64U,0x31CD86D3U,0x3C8EA00AU,0x384FBDBDU,
|
||||||
|
0x4C11DB70U,0x48D0C6C7U,0x4593E01EU,0x4152FDA9U,
|
||||||
|
0x5F15ADACU,0x5BD4B01BU,0x569796C2U,0x52568B75U,
|
||||||
|
0x6A1936C8U,0x6ED82B7FU,0x639B0DA6U,0x675A1011U,
|
||||||
|
0x791D4014U,0x7DDC5DA3U,0x709F7B7AU,0x745E66CDU,
|
||||||
|
0x9823B6E0U,0x9CE2AB57U,0x91A18D8EU,0x95609039U,
|
||||||
|
0x8B27C03CU,0x8FE6DD8BU,0x82A5FB52U,0x8664E6E5U,
|
||||||
|
0xBE2B5B58U,0xBAEA46EFU,0xB7A96036U,0xB3687D81U,
|
||||||
|
0xAD2F2D84U,0xA9EE3033U,0xA4AD16EAU,0xA06C0B5DU,
|
||||||
|
0xD4326D90U,0xD0F37027U,0xDDB056FEU,0xD9714B49U,
|
||||||
|
0xC7361B4CU,0xC3F706FBU,0xCEB42022U,0xCA753D95U,
|
||||||
|
0xF23A8028U,0xF6FB9D9FU,0xFBB8BB46U,0xFF79A6F1U,
|
||||||
|
0xE13EF6F4U,0xE5FFEB43U,0xE8BCCD9AU,0xEC7DD02DU,
|
||||||
|
0x34867077U,0x30476DC0U,0x3D044B19U,0x39C556AEU,
|
||||||
|
0x278206ABU,0x23431B1CU,0x2E003DC5U,0x2AC12072U,
|
||||||
|
0x128E9DCFU,0x164F8078U,0x1B0CA6A1U,0x1FCDBB16U,
|
||||||
|
0x018AEB13U,0x054BF6A4U,0x0808D07DU,0x0CC9CDCAU,
|
||||||
|
0x7897AB07U,0x7C56B6B0U,0x71159069U,0x75D48DDEU,
|
||||||
|
0x6B93DDDBU,0x6F52C06CU,0x6211E6B5U,0x66D0FB02U,
|
||||||
|
0x5E9F46BFU,0x5A5E5B08U,0x571D7DD1U,0x53DC6066U,
|
||||||
|
0x4D9B3063U,0x495A2DD4U,0x44190B0DU,0x40D816BAU,
|
||||||
|
0xACA5C697U,0xA864DB20U,0xA527FDF9U,0xA1E6E04EU,
|
||||||
|
0xBFA1B04BU,0xBB60ADFCU,0xB6238B25U,0xB2E29692U,
|
||||||
|
0x8AAD2B2FU,0x8E6C3698U,0x832F1041U,0x87EE0DF6U,
|
||||||
|
0x99A95DF3U,0x9D684044U,0x902B669DU,0x94EA7B2AU,
|
||||||
|
0xE0B41DE7U,0xE4750050U,0xE9362689U,0xEDF73B3EU,
|
||||||
|
0xF3B06B3BU,0xF771768CU,0xFA325055U,0xFEF34DE2U,
|
||||||
|
0xC6BCF05FU,0xC27DEDE8U,0xCF3ECB31U,0xCBFFD686U,
|
||||||
|
0xD5B88683U,0xD1799B34U,0xDC3ABDEDU,0xD8FBA05AU,
|
||||||
|
0x690CE0EEU,0x6DCDFD59U,0x608EDB80U,0x644FC637U,
|
||||||
|
0x7A089632U,0x7EC98B85U,0x738AAD5CU,0x774BB0EBU,
|
||||||
|
0x4F040D56U,0x4BC510E1U,0x46863638U,0x42472B8FU,
|
||||||
|
0x5C007B8AU,0x58C1663DU,0x558240E4U,0x51435D53U,
|
||||||
|
0x251D3B9EU,0x21DC2629U,0x2C9F00F0U,0x285E1D47U,
|
||||||
|
0x36194D42U,0x32D850F5U,0x3F9B762CU,0x3B5A6B9BU,
|
||||||
|
0x0315D626U,0x07D4CB91U,0x0A97ED48U,0x0E56F0FFU,
|
||||||
|
0x1011A0FAU,0x14D0BD4DU,0x19939B94U,0x1D528623U,
|
||||||
|
0xF12F560EU,0xF5EE4BB9U,0xF8AD6D60U,0xFC6C70D7U,
|
||||||
|
0xE22B20D2U,0xE6EA3D65U,0xEBA91BBCU,0xEF68060BU,
|
||||||
|
0xD727BBB6U,0xD3E6A601U,0xDEA580D8U,0xDA649D6FU,
|
||||||
|
0xC423CD6AU,0xC0E2D0DDU,0xCDA1F604U,0xC960EBB3U,
|
||||||
|
0xBD3E8D7EU,0xB9FF90C9U,0xB4BCB610U,0xB07DABA7U,
|
||||||
|
0xAE3AFBA2U,0xAAFBE615U,0xA7B8C0CCU,0xA379DD7BU,
|
||||||
|
0x9B3660C6U,0x9FF77D71U,0x92B45BA8U,0x9675461FU,
|
||||||
|
0x8832161AU,0x8CF30BADU,0x81B02D74U,0x857130C3U,
|
||||||
|
0x5D8A9099U,0x594B8D2EU,0x5408ABF7U,0x50C9B640U,
|
||||||
|
0x4E8EE645U,0x4A4FFBF2U,0x470CDD2BU,0x43CDC09CU,
|
||||||
|
0x7B827D21U,0x7F436096U,0x7200464FU,0x76C15BF8U,
|
||||||
|
0x68860BFDU,0x6C47164AU,0x61043093U,0x65C52D24U,
|
||||||
|
0x119B4BE9U,0x155A565EU,0x18197087U,0x1CD86D30U,
|
||||||
|
0x029F3D35U,0x065E2082U,0x0B1D065BU,0x0FDC1BECU,
|
||||||
|
0x3793A651U,0x3352BBE6U,0x3E119D3FU,0x3AD08088U,
|
||||||
|
0x2497D08DU,0x2056CD3AU,0x2D15EBE3U,0x29D4F654U,
|
||||||
|
0xC5A92679U,0xC1683BCEU,0xCC2B1D17U,0xC8EA00A0U,
|
||||||
|
0xD6AD50A5U,0xD26C4D12U,0xDF2F6BCBU,0xDBEE767CU,
|
||||||
|
0xE3A1CBC1U,0xE760D676U,0xEA23F0AFU,0xEEE2ED18U,
|
||||||
|
0xF0A5BD1DU,0xF464A0AAU,0xF9278673U,0xFDE69BC4U,
|
||||||
|
0x89B8FD09U,0x8D79E0BEU,0x803AC667U,0x84FBDBD0U,
|
||||||
|
0x9ABC8BD5U,0x9E7D9662U,0x933EB0BBU,0x97FFAD0CU,
|
||||||
|
0xAFB010B1U,0xAB710D06U,0xA6322BDFU,0xA2F33668U,
|
||||||
|
0xBCB4666DU,0xB8757BDAU,0xB5365D03U,0xB1F740B4U,
|
||||||
|
};
|
||||||
|
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
crc = table[*data ^ ((crc >> 24) & 0xff)] ^ (crc << 8);
|
||||||
|
data++;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
digital_crc32(const unsigned char *buf, size_t len)
|
||||||
|
{
|
||||||
|
return digital_update_crc32(0xffffffff, buf, len) ^ 0xffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
43
libpcp/digital_crc32.h
Normal file
43
libpcp/digital_crc32.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2005,2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Radio
|
||||||
|
*
|
||||||
|
* GNU Radio 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, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* GNU Radio is distributed in the hope that 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 GNU Radio; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDED_DIGITAL_CRC32_H
|
||||||
|
#define INCLUDED_DIGITAL_CRC32_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief update running CRC-32
|
||||||
|
* \ingroup misc
|
||||||
|
*
|
||||||
|
* Update a running CRC with the bytes buf[0..len-1] The CRC should be
|
||||||
|
* initialized to all 1's, and the transmitted value is the 1's
|
||||||
|
* complement of the final running CRC. The resulting CRC should be
|
||||||
|
* transmitted in big endian order.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
digital_update_crc32(unsigned int crc, const unsigned char *buf, size_t len);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
digital_crc32(const unsigned char *buf, size_t len);
|
||||||
|
|
||||||
|
#endif /* INCLUDED_CRC32_H */
|
||||||
29
libpcp/fatal.c
Normal file
29
libpcp/fatal.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void fatal(const char * fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
|
||||||
|
vasprintf(&PCP_ERR, fmt, ap);
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
PCP_ERRSET = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fatals_ifany() {
|
||||||
|
if(PCP_ERRSET == 1) {
|
||||||
|
fprintf(stderr, PCP_ERR);
|
||||||
|
if(errno) {
|
||||||
|
fprintf(stderr, "Error: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
free(PCP_ERR);
|
||||||
|
PCP_EXIT = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
57
libpcp/getpass.c
Normal file
57
libpcp/getpass.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#include "getpass.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (unportable) functions to turn on/off terminal echo
|
||||||
|
* using termios functions. might compile however on
|
||||||
|
* most unices, tested on FreeBSD only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct termios stored_settings;
|
||||||
|
|
||||||
|
void pcp_echo_off() {
|
||||||
|
struct termios new_settings;
|
||||||
|
tcgetattr(0,&stored_settings);
|
||||||
|
new_settings = stored_settings;
|
||||||
|
new_settings.c_lflag &= (~ECHO);
|
||||||
|
tcsetattr(0,TCSANOW,&new_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcp_echo_on() {
|
||||||
|
tcsetattr(0,TCSANOW,&stored_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read a line from stdin, return without
|
||||||
|
* trailing \n or NULL if something went
|
||||||
|
* wrong
|
||||||
|
*/
|
||||||
|
char *pcp_get_stdin() {
|
||||||
|
char *line = NULL;
|
||||||
|
size_t linecap = 0;
|
||||||
|
ssize_t linelen;
|
||||||
|
linelen = getline(&line, &linecap, stdin);
|
||||||
|
|
||||||
|
if (linelen < 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
line[linelen - 1] = '\0'; // remove newline at end
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* turn off terminal echo, ask for a passphrase
|
||||||
|
* and turn it on again
|
||||||
|
*/
|
||||||
|
char * pcp_get_passphrase(char *prompt) {
|
||||||
|
printf("%s: ", prompt);
|
||||||
|
pcp_echo_off();
|
||||||
|
char *line = pcp_get_stdin();
|
||||||
|
pcp_echo_on();
|
||||||
|
printf("\n");
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
22
libpcp/getpass.h
Normal file
22
libpcp/getpass.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef _HAVE_PCP_GETPASS
|
||||||
|
#define _HAVE_PCP_GETPASS
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (unportable) functions to turn on/off terminal echo
|
||||||
|
* using termios functions. might compile however on
|
||||||
|
* most unices, tested on FreeBSD only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_echo_off();
|
||||||
|
void pcp_echo_on();
|
||||||
|
char *pcp_get_stdin();
|
||||||
|
char *pcp_get_passphrase(char *prompt);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_GETPASS
|
||||||
48
libpcp/jenhash.c
Normal file
48
libpcp/jenhash.c
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include "jenhash.h"
|
||||||
|
|
||||||
|
unsigned jen_hash ( unsigned char *k, unsigned length, unsigned initval ) {
|
||||||
|
unsigned a, b;
|
||||||
|
unsigned c = initval;
|
||||||
|
unsigned len = length;
|
||||||
|
|
||||||
|
a = b = 0x9e3779b9;
|
||||||
|
|
||||||
|
while ( len >= 12 ) {
|
||||||
|
a += ( k[0] + ( (unsigned)k[1] << 8 )
|
||||||
|
+ ( (unsigned)k[2] << 16 )
|
||||||
|
+ ( (unsigned)k[3] << 24 ) );
|
||||||
|
b += ( k[4] + ( (unsigned)k[5] << 8 )
|
||||||
|
+ ( (unsigned)k[6] << 16 )
|
||||||
|
+ ( (unsigned)k[7] << 24 ) );
|
||||||
|
c += ( k[8] + ( (unsigned)k[9] << 8 )
|
||||||
|
+ ( (unsigned)k[10] << 16 )
|
||||||
|
+ ( (unsigned)k[11] << 24 ) );
|
||||||
|
|
||||||
|
jen_mix ( a, b, c );
|
||||||
|
|
||||||
|
k += 12;
|
||||||
|
len -= 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
c += length;
|
||||||
|
|
||||||
|
switch ( len ) {
|
||||||
|
case 11: c += ( (unsigned)k[10] << 24 );
|
||||||
|
case 10: c += ( (unsigned)k[9] << 16 );
|
||||||
|
case 9 : c += ( (unsigned)k[8] << 8 );
|
||||||
|
/* First byte of c reserved for length */
|
||||||
|
case 8 : b += ( (unsigned)k[7] << 24 );
|
||||||
|
case 7 : b += ( (unsigned)k[6] << 16 );
|
||||||
|
case 6 : b += ( (unsigned)k[5] << 8 );
|
||||||
|
case 5 : b += k[4];
|
||||||
|
case 4 : a += ( (unsigned)k[3] << 24 );
|
||||||
|
case 3 : a += ( (unsigned)k[2] << 16 );
|
||||||
|
case 2 : a += ( (unsigned)k[1] << 8 );
|
||||||
|
case 1 : a += k[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
jen_mix ( a, b, c );
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
25
libpcp/jenhash.h
Normal file
25
libpcp/jenhash.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef _HAVE_JENHASH_H
|
||||||
|
#define _HAVE_JENHASH_H
|
||||||
|
|
||||||
|
// Bob Jenkins 32bit hash function
|
||||||
|
// via: http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
|
||||||
|
|
||||||
|
#define jen_mix(a,b,c) \
|
||||||
|
{ \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 13 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 8 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 13 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 12 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 16 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 5 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 3 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 10 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 15 ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define JEN_PSALT 0xD9A03
|
||||||
|
#define JEN_SSALT 0xC503B
|
||||||
|
|
||||||
|
unsigned jen_hash ( unsigned char *k, unsigned length, unsigned initval );
|
||||||
|
|
||||||
|
#endif // _HAVE_JENHASH_H
|
||||||
199
libpcp/key.c
Normal file
199
libpcp/key.c
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
#include "key.h"
|
||||||
|
|
||||||
|
char *pcp_getkeyid(pcp_key_t *k) {
|
||||||
|
uint32_t s, p;
|
||||||
|
p = jen_hash(k->public, 32, JEN_PSALT);
|
||||||
|
s = jen_hash(k->secret, 32, JEN_SSALT);
|
||||||
|
char *id = ucmalloc(17);
|
||||||
|
snprintf(id, 17, "%08X%08X", p, s);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t * pcpkey_new () {
|
||||||
|
byte public[32] = { 0 };
|
||||||
|
byte secret[32] = { 0 };
|
||||||
|
|
||||||
|
// generate curve 25519 keypair
|
||||||
|
if(crypto_box_keypair (public, secret) != 0) {
|
||||||
|
fatal("Failed to generate a CURVE25519 keypair!\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill in our struct
|
||||||
|
pcp_key_t *key = urmalloc(sizeof(pcp_key_t));
|
||||||
|
memcpy (key->public, public, 32);
|
||||||
|
memcpy (key->secret, secret, 32);
|
||||||
|
memcpy (key->id, pcp_getkeyid(key), 17);
|
||||||
|
|
||||||
|
key->ctime = (long)time(0);
|
||||||
|
|
||||||
|
key->version = PCP_KEY_VERSION;
|
||||||
|
key->serial = arc4random();
|
||||||
|
key->type = PCP_KEY_TYPE_SECRET;
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char * pcp_gennonce() {
|
||||||
|
unsigned char *nonce = ucmalloc(crypto_secretbox_NONCEBYTES);
|
||||||
|
arc4random_buf(nonce, crypto_secretbox_NONCEBYTES);
|
||||||
|
return nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_encrypt(pcp_key_t *key, char *passphrase) {
|
||||||
|
if(key->nonce[0] == 0) {
|
||||||
|
unsigned char *nonce = pcp_gennonce();
|
||||||
|
memcpy (key->nonce, nonce, crypto_secretbox_NONCEBYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *encryptkey = pcp_derivekey(passphrase);
|
||||||
|
|
||||||
|
unsigned char *encrypted;
|
||||||
|
size_t es;
|
||||||
|
|
||||||
|
es = pcp_sodium_mac(&encrypted, key->secret, 32, key->nonce, encryptkey);
|
||||||
|
|
||||||
|
bzero(encryptkey, 32);
|
||||||
|
free(encryptkey);
|
||||||
|
|
||||||
|
if(es == 48) {
|
||||||
|
// success
|
||||||
|
memcpy(key->encrypted, encrypted, 48);
|
||||||
|
arc4random_buf(key->secret, 32);
|
||||||
|
key->secret[0] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("failed to encrypt the secret key!\n");
|
||||||
|
free(key);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_decrypt(pcp_key_t *key, char *passphrase) {
|
||||||
|
unsigned char *encryptkey = pcp_derivekey(passphrase);
|
||||||
|
unsigned char *decrypted;
|
||||||
|
size_t es;
|
||||||
|
|
||||||
|
es = pcp_sodium_verify_mac(&decrypted, key->encrypted, 48, key->nonce, encryptkey);
|
||||||
|
|
||||||
|
bzero(encryptkey, 32);
|
||||||
|
free(encryptkey);
|
||||||
|
|
||||||
|
if(es == 0) {
|
||||||
|
// success
|
||||||
|
memcpy(key->secret, decrypted, 32);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("failed to decrypt the secret key (got %d, expected 32)!\n", es);
|
||||||
|
free(key);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *pcpkey_pub_from_secret(pcp_key_t *key) {
|
||||||
|
//pcp_dumpkey(key);
|
||||||
|
pcp_pubkey_t *pub = urmalloc(sizeof (pcp_pubkey_t));
|
||||||
|
memcpy(pub->public, key->public, 32);
|
||||||
|
memcpy(pub->owner, key->owner, 255);
|
||||||
|
memcpy(pub->mail, key->mail, 255);
|
||||||
|
memcpy(pub->id, key->id, 17);
|
||||||
|
pub->version = key->version;
|
||||||
|
pub->type = PCP_KEY_TYPE_PUBLIC;
|
||||||
|
pub->ctime = key->ctime;
|
||||||
|
return pub;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pcppubkey_get_art(pcp_pubkey_t *k) {
|
||||||
|
char *r = key_fingerprint_randomart(k->public, sizeof(k));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pcpkey_get_art(pcp_key_t *k) {
|
||||||
|
char *r = key_fingerprint_randomart(k->public, sizeof(k));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *pcppubkey_getchecksum(pcp_pubkey_t *k) {
|
||||||
|
unsigned char *hash = ucmalloc(32);
|
||||||
|
crypto_hash_sha256(hash, k->public, 32);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *pcpkey_getchecksum(pcp_key_t *k) {
|
||||||
|
unsigned char *hash = ucmalloc(32);
|
||||||
|
crypto_hash_sha256(hash, k->public, 32);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_inithashes() {
|
||||||
|
pcpkey_hash = NULL;
|
||||||
|
pcppubkey_hash = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcp_cleanhashes() {
|
||||||
|
if(pcpkey_hash != NULL) {
|
||||||
|
pcp_key_t *current_key, *tmp;
|
||||||
|
HASH_ITER(hh, pcpkey_hash, current_key, tmp) {
|
||||||
|
HASH_DEL(pcpkey_hash,current_key);
|
||||||
|
bzero(current_key, sizeof(pcp_key_t));
|
||||||
|
free(current_key); // FIXME: coredumps here after n-th secret keys has been added
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pcppubkey_hash != NULL) {
|
||||||
|
pcp_pubkey_t *current_pub, *ptmp;
|
||||||
|
HASH_ITER(hh, pcppubkey_hash, current_pub, ptmp) {
|
||||||
|
HASH_DEL(pcppubkey_hash,current_pub);
|
||||||
|
bzero(current_pub, sizeof(pcp_pubkey_t));
|
||||||
|
free(current_pub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcp_inithashes();
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_exists(char *id) {
|
||||||
|
pcp_key_t *key = NULL;
|
||||||
|
HASH_FIND_STR(pcpkey_hash, id, key);
|
||||||
|
return key; // maybe NULL!
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *pcppubkey_exists(char *id) {
|
||||||
|
pcp_pubkey_t *key = NULL;
|
||||||
|
HASH_FIND_STR(pcppubkey_hash, id, key);
|
||||||
|
return key; // maybe NULL!
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t * key2be(pcp_key_t *k) {
|
||||||
|
k->version = htobe32(k->version);
|
||||||
|
k->serial = htobe32(k->serial);
|
||||||
|
k->ctime = htobe64(k->ctime);
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *key2native(pcp_key_t *k) {
|
||||||
|
k->version = be32toh(k->version);
|
||||||
|
k->serial = be32toh(k->serial);
|
||||||
|
k->ctime = be64toh(k->ctime);
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t * pubkey2be(pcp_pubkey_t *k) {
|
||||||
|
k->version = htobe32(k->version);
|
||||||
|
k->serial = htobe32(k->serial);
|
||||||
|
k->ctime = htobe64(k->ctime);
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *pubkey2native(pcp_pubkey_t *k) {
|
||||||
|
k->version = be32toh(k->version);
|
||||||
|
k->serial = be32toh(k->serial);
|
||||||
|
k->ctime = be64toh(k->ctime);
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
120
libpcp/key.h
Normal file
120
libpcp/key.h
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#ifndef _HAVE_PCP_KEYPAIR_H
|
||||||
|
#define _HAVE_PCP_KEYPAIR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/endian.h> // FIXME: put portable thing from scrypt here
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "mem.h"
|
||||||
|
#include "mac.h"
|
||||||
|
#include "randomart.h"
|
||||||
|
#include "version.h"
|
||||||
|
#include "z85.h"
|
||||||
|
#include "uthash.h"
|
||||||
|
#include "jenhash.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
PCP private key structure. Most fields are self explanatory.
|
||||||
|
Some notes:
|
||||||
|
|
||||||
|
'encrypted' contains the encrypted secret key. If it's set,
|
||||||
|
the field 'secret' which contains the clear secret key will
|
||||||
|
be zeroed with random values, the first byte will be 0.
|
||||||
|
|
||||||
|
'nonce' contains the nonce required to decrypt the encrypted
|
||||||
|
secret, if set.
|
||||||
|
|
||||||
|
'serial' is a random number.
|
||||||
|
|
||||||
|
'id' is a string containing the hex values of the CRC32 checksum
|
||||||
|
of the public and secret key.
|
||||||
|
|
||||||
|
Upon creation everything will be filled with random bytes.
|
||||||
|
String fields will contain a string followed by 0 followed
|
||||||
|
by the rest of the pre-filled random bytes. To denote a string
|
||||||
|
field as empty, the first byte will be set to 0.
|
||||||
|
|
||||||
|
There are dynamically calculated attributes as well:
|
||||||
|
|
||||||
|
'checksum' is a 256 bit SHA hash of the public key returned
|
||||||
|
by pcpkey_getchecksum() or pcppubkey_getchecksum().
|
||||||
|
|
||||||
|
'random id' is a random art ascii image returned by
|
||||||
|
pcppubkey_get_art() or pcpkey_get_art(), calculated from
|
||||||
|
the public key.
|
||||||
|
|
||||||
|
If exported to a single file or printed, the structure will
|
||||||
|
be encoded using Z85 encoding.
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct _pcp_key_t {
|
||||||
|
byte public[32];
|
||||||
|
byte secret[32];
|
||||||
|
byte nonce[24];
|
||||||
|
byte encrypted[48];
|
||||||
|
char owner[255];
|
||||||
|
char mail[255];
|
||||||
|
char id[17];
|
||||||
|
long ctime;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t serial;
|
||||||
|
uint8_t type;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _pcp_pubkey_t {
|
||||||
|
byte public[32];
|
||||||
|
char owner[255];
|
||||||
|
char mail[255];
|
||||||
|
char id[17];
|
||||||
|
long ctime;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t serial;
|
||||||
|
uint8_t type;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _pcp_key_t pcp_key_t;
|
||||||
|
typedef struct _pcp_pubkey_t pcp_pubkey_t;
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_hash;
|
||||||
|
pcp_pubkey_t *pcppubkey_hash;
|
||||||
|
|
||||||
|
void pcp_cleanhashes();
|
||||||
|
pcp_key_t *pcpkey_new ();
|
||||||
|
|
||||||
|
char *pcppubkey_get_art(pcp_pubkey_t *k);
|
||||||
|
char *pcpkey_get_art(pcp_key_t *k);
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_encrypt(pcp_key_t *key, char *passphrase);
|
||||||
|
pcp_key_t *pcpkey_decrypt(pcp_key_t *key, char *passphrase);
|
||||||
|
pcp_pubkey_t *pcpkey_pub_from_secret(pcp_key_t *key);
|
||||||
|
char *pcp_getkeyid(pcp_key_t *k);
|
||||||
|
unsigned char *pcppubkey_getchecksum(pcp_pubkey_t *k);
|
||||||
|
unsigned char *pcpkey_getchecksum(pcp_key_t *k);
|
||||||
|
void pcp_inithashes();
|
||||||
|
|
||||||
|
pcp_key_t *pcpkey_exists(char *id);
|
||||||
|
pcp_pubkey_t *pcppubkey_exists(char *id);
|
||||||
|
|
||||||
|
pcp_key_t * key2be(pcp_key_t *k);
|
||||||
|
pcp_key_t *key2native(pcp_key_t *k);
|
||||||
|
pcp_pubkey_t * pubkey2be(pcp_pubkey_t *k);
|
||||||
|
pcp_pubkey_t *pubkey2native(pcp_pubkey_t *k);
|
||||||
|
|
||||||
|
unsigned char * pcp_gennonce();
|
||||||
|
|
||||||
|
void pcpedit_key(char *keyid);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_KEYPAIR_H
|
||||||
97
libpcp/mac.c
Normal file
97
libpcp/mac.c
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
#include "mac.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char *pcp_derivekey(char *passphrase) {
|
||||||
|
unsigned char *hash64 = ucmalloc(crypto_hash_BYTES);
|
||||||
|
unsigned char *xor = ucmalloc(crypto_secretbox_KEYBYTES);
|
||||||
|
unsigned char *key = ucmalloc(crypto_secretbox_KEYBYTES);
|
||||||
|
|
||||||
|
size_t plen = strnlen(passphrase, 255);
|
||||||
|
unsigned char *temp = ucmalloc(crypto_hash_BYTES);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// make a hash from the passphrase and then HCYCLES times from the result
|
||||||
|
memcpy(temp, passphrase, plen);
|
||||||
|
for(i=0; i<HCYCLES; ++i) {
|
||||||
|
if(crypto_hash(hash64, temp, plen) == 0) {
|
||||||
|
memcpy(temp, hash64, crypto_hash_BYTES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// xor the first half of the hash with the latter to get
|
||||||
|
// a 32 byte array
|
||||||
|
for(i=0; i<crypto_secretbox_KEYBYTES; ++i) {
|
||||||
|
xor[i] = hash64[i] ^ hash64[i + crypto_secretbox_KEYBYTES];
|
||||||
|
}
|
||||||
|
|
||||||
|
// turn the 32byte hash into a secret key
|
||||||
|
xor[0] &= 248;
|
||||||
|
xor[31] &= 127;
|
||||||
|
xor[31] |= 64;
|
||||||
|
|
||||||
|
memcpy(key, xor, crypto_secretbox_KEYBYTES);
|
||||||
|
|
||||||
|
bzero(passphrase, plen);
|
||||||
|
bzero(temp, crypto_hash_BYTES);
|
||||||
|
free(passphrase);
|
||||||
|
free(temp);
|
||||||
|
free(xor);
|
||||||
|
free(hash64);
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t pcp_sodium_mac(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *key) {
|
||||||
|
unsigned char *pad_clear;
|
||||||
|
unsigned char *pad_cipher;
|
||||||
|
|
||||||
|
pad_cipher = ucmalloc(crypto_secretbox_ZEROBYTES + clearsize);
|
||||||
|
|
||||||
|
pcp_pad_prepend(&pad_clear, cleartext, crypto_secretbox_ZEROBYTES, clearsize);
|
||||||
|
|
||||||
|
crypto_secretbox(pad_cipher, pad_clear,
|
||||||
|
clearsize + crypto_secretbox_ZEROBYTES, nonce, key);
|
||||||
|
|
||||||
|
pcp_pad_remove(cipher, pad_cipher, crypto_secretbox_BOXZEROBYTES,
|
||||||
|
(clearsize + crypto_secretbox_ZEROBYTES) - crypto_secretbox_BOXZEROBYTES);
|
||||||
|
|
||||||
|
free(pad_clear);
|
||||||
|
free(pad_cipher);
|
||||||
|
|
||||||
|
return (clearsize + crypto_secretbox_ZEROBYTES) - crypto_secretbox_BOXZEROBYTES;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcp_sodium_verify_mac(unsigned char **cleartext, unsigned char* message,
|
||||||
|
size_t messagesize, unsigned char *nonce,
|
||||||
|
unsigned char *key) {
|
||||||
|
// verify the mac
|
||||||
|
unsigned char *pad_cipher;
|
||||||
|
unsigned char *pad_clear;
|
||||||
|
int success = -1;
|
||||||
|
|
||||||
|
pcp_pad_prepend(&pad_cipher, message, crypto_secretbox_BOXZEROBYTES, messagesize);
|
||||||
|
|
||||||
|
pad_clear = (unsigned char *)ucmalloc((crypto_secretbox_BOXZEROBYTES + messagesize));
|
||||||
|
|
||||||
|
if (crypto_secretbox_open(pad_clear,
|
||||||
|
pad_cipher,
|
||||||
|
messagesize + crypto_secretbox_BOXZEROBYTES,
|
||||||
|
nonce, key) == 0) {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pad_remove(cleartext, pad_clear, crypto_secretbox_ZEROBYTES, messagesize);
|
||||||
|
|
||||||
|
free(pad_clear);
|
||||||
|
free(pad_cipher);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
70
libpcp/mac.h
Normal file
70
libpcp/mac.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#ifndef _HAVE_PCP_MAC
|
||||||
|
#define _HAVE_PCP_MAC
|
||||||
|
|
||||||
|
#include <strings.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sodium.h>
|
||||||
|
#include "pad.h"
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
// how many times do we hash the passphrase
|
||||||
|
#define HCYCLES 128000
|
||||||
|
|
||||||
|
// encrypt some arbitrary cleartext using
|
||||||
|
// a curve25519 secret key and a given nonce.
|
||||||
|
//
|
||||||
|
// expects a pointer to the target binary
|
||||||
|
// stream containing the encrypted data,
|
||||||
|
// the cleartext string, its size, the nonce
|
||||||
|
// (24 bytes) and the secret key (32 bytes).
|
||||||
|
//
|
||||||
|
// allocates memory for the returned cipher
|
||||||
|
// and it is up to the user to free it after use.
|
||||||
|
//
|
||||||
|
// returns the size of the returned cipherstream.
|
||||||
|
// in case of an error, the cipher will be set
|
||||||
|
// to NULL.
|
||||||
|
size_t pcp_sodium_mac(unsigned char **cipher,
|
||||||
|
unsigned char *cleartext,
|
||||||
|
size_t clearsize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *key);
|
||||||
|
|
||||||
|
// does the opposite of pcp_sodium_mac and decrypts
|
||||||
|
// a given encrypted binary stream using a nonce and
|
||||||
|
// a secret key (sizes: see above).
|
||||||
|
//
|
||||||
|
// allocates memory for the returned cleartext and
|
||||||
|
// it is up to the user to free it after use.
|
||||||
|
//
|
||||||
|
// returns 0 if decryption and verification were
|
||||||
|
// successful, otherwise -1.
|
||||||
|
int pcp_sodium_verify_mac(unsigned char **cleartext,
|
||||||
|
unsigned char* message,
|
||||||
|
size_t messagesize,
|
||||||
|
unsigned char *nonce,
|
||||||
|
unsigned char *key);
|
||||||
|
|
||||||
|
// generate a nonce from random source arc4random().
|
||||||
|
// allocates memory for the returned nonce and
|
||||||
|
// it is up to the user to free it after use.
|
||||||
|
void pcp_makenonce(unsigned char **nonce);
|
||||||
|
|
||||||
|
// proprietary key derivation function. derives an
|
||||||
|
// secure encryption key from the given passphrase by
|
||||||
|
// calculating a SALSA20 hash from it HCYCLES times.
|
||||||
|
//
|
||||||
|
// turns the result into a proper CURVE25519 secret
|
||||||
|
// key. allocates memory for key and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// deprecation warning: maybe removed once the libsodium
|
||||||
|
// developers incorporated some key derivation function
|
||||||
|
// into libsodium. so far, there's none but word goes
|
||||||
|
// that perhaps something like scrypt() from the star
|
||||||
|
// distribution may be added in the future.
|
||||||
|
unsigned char *pcp_derivekey(char *passphrase);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_MAC
|
||||||
33
libpcp/mem.c
Normal file
33
libpcp/mem.c
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include "mem.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
void *ucmalloc(size_t s) {
|
||||||
|
size_t size = s * sizeof(unsigned char);
|
||||||
|
void *value = malloc (size);
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
err(errno, "Cannot allocate memory");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero (value, size);
|
||||||
|
|
||||||
|
//printf("allocated %d bytes at %p\n", (int)size, value);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *urmalloc(size_t s) {
|
||||||
|
void *value = ucmalloc (s);
|
||||||
|
|
||||||
|
arc4random_buf(value, s);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void *ucfree(void *ptr) {
|
||||||
|
free(ptr);
|
||||||
|
ptr = NULL;
|
||||||
|
}
|
||||||
24
libpcp/mem.h
Normal file
24
libpcp/mem.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef _HAVE_PCP_MEM
|
||||||
|
#define _HAVE_PCP_MEM
|
||||||
|
|
||||||
|
#include <strings.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <err.h>
|
||||||
|
|
||||||
|
// simple malloc() wrapper
|
||||||
|
// behaves like calloc(), which
|
||||||
|
// I don't have here.
|
||||||
|
//
|
||||||
|
// exits if there's no more memory
|
||||||
|
// available.
|
||||||
|
void *ucmalloc(size_t s);
|
||||||
|
|
||||||
|
// the same but it fills the pointer with random values
|
||||||
|
void *urmalloc(size_t s);
|
||||||
|
|
||||||
|
// dito.
|
||||||
|
void *ucfree(void *ptr);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_MEM
|
||||||
53
libpcp/pad.c
Normal file
53
libpcp/pad.c
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#include "pad.h"
|
||||||
|
|
||||||
|
void pcp_pad_prepend(unsigned char **padded, unsigned char *unpadded,
|
||||||
|
size_t padlen, size_t unpadlen) {
|
||||||
|
*padded = ucmalloc(unpadlen + padlen);
|
||||||
|
unsigned char *tmp = ucmalloc(unpadlen + padlen);
|
||||||
|
|
||||||
|
// pcp_append orig
|
||||||
|
int i;
|
||||||
|
for(i=0; i<unpadlen; ++i) {
|
||||||
|
tmp[i + padlen] = unpadded[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(*padded, tmp, unpadlen + padlen);
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcp_pad_remove(unsigned char **unpadded, unsigned char *padded,
|
||||||
|
size_t padlen, size_t unpadlen) {
|
||||||
|
*unpadded = ucmalloc(unpadlen * sizeof(unsigned char));
|
||||||
|
unsigned char *tmp = ucmalloc(unpadlen);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i=0; i<unpadlen; ++i) {
|
||||||
|
tmp[i] = padded[padlen + i];
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(*unpadded, tmp, unpadlen);
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _MK_ZPAD_MAIN
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
if(argc >= 2) {
|
||||||
|
size_t unpadlen;
|
||||||
|
int padlen = strtol(argv[2], NULL, 0);
|
||||||
|
unpadlen = strlen(argv[1]);
|
||||||
|
unsigned char *dst;
|
||||||
|
|
||||||
|
pcp_pad_prepend(&dst, argv[1], padlen, unpadlen);
|
||||||
|
//printf(" prev: %s\n after: %s\n", argv[1], dst);
|
||||||
|
|
||||||
|
unsigned char *reverse;
|
||||||
|
pcp_pad_remove(&reverse, dst, padlen, unpadlen);
|
||||||
|
//printf("reverse: %s\n", reverse);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//fprintf(stderr, "Usage: pad <string> <padlen>\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
76
libpcp/pad.h
Normal file
76
libpcp/pad.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#ifndef _HAVE_PCP_ZPADDING
|
||||||
|
#define _HAVE_PCP_ZPADDING
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define ZPADCHAR 48
|
||||||
|
#else
|
||||||
|
#define ZPADCHAR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// prepends a binary stream with a number of
|
||||||
|
// \0's as required by the secret_box and
|
||||||
|
// secret_box_open functions of libsodium.
|
||||||
|
//
|
||||||
|
// parameters:
|
||||||
|
//
|
||||||
|
// padded: destination array (ref)
|
||||||
|
// unpadded: source array without padding
|
||||||
|
// padlen: length of padding
|
||||||
|
// unpadlen: length of source array
|
||||||
|
//
|
||||||
|
// turns "efa5" into "00000000efa5" with padlen 8
|
||||||
|
//
|
||||||
|
// if DEBUG is set, destination will be padded with
|
||||||
|
// the character '0', NOT the integer 0.
|
||||||
|
//
|
||||||
|
// allocates memory for padded and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// sample call:
|
||||||
|
//
|
||||||
|
// char unpadded[] = {0xef, 0xa5};
|
||||||
|
// unsigned char *padded;
|
||||||
|
// pcp_pad_prepend(&padded, unpadded, 8, 2);
|
||||||
|
//
|
||||||
|
// the result, padded, would be 10 bytes long, 8
|
||||||
|
// bytes for the leading zeros and 2 for the content
|
||||||
|
// of the original unpadded.
|
||||||
|
void pcp_pad_prepend(unsigned char **padded, unsigned char *unpadded,
|
||||||
|
size_t padlen, size_t unpadlen);
|
||||||
|
|
||||||
|
// removes zero's of a binary stream, which is
|
||||||
|
// the reverse of pcp_pad_prepend().
|
||||||
|
//
|
||||||
|
// parameters:
|
||||||
|
//
|
||||||
|
// unpadded: destination array (ref), with padding removed
|
||||||
|
// padded: source array with padding
|
||||||
|
// padlen: length of padding
|
||||||
|
// unpadlen: length of source array
|
||||||
|
//
|
||||||
|
// turns "00000000efa5" into "efa5" with padlen 8
|
||||||
|
//
|
||||||
|
// allocates memory for unpadded and it is up to the
|
||||||
|
// user to free it after use.
|
||||||
|
//
|
||||||
|
// sample call:
|
||||||
|
//
|
||||||
|
// char padded[] = {0x0, 0x0, 0x0, 0x0, 0xef, 0xa5};
|
||||||
|
// unsigned char *unpadded;
|
||||||
|
// pcp_pad_remove(unpadded, padded, 4, 2);
|
||||||
|
//
|
||||||
|
// the result, unpadded would be 2 bytes long containing
|
||||||
|
// only the 2 bytes we want to have with zeros removed.
|
||||||
|
void pcp_pad_remove(unsigned char **unpadded, unsigned char *padded,
|
||||||
|
size_t padlen, size_t unpadlen);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_ZPADDING
|
||||||
13
libpcp/platform.h
Normal file
13
libpcp/platform.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef _HAVE_PCP_PLATFORM_H
|
||||||
|
#define _HAVE_PCP_PLATFORM_H
|
||||||
|
|
||||||
|
#if defined(CONFIG_H_FILE)
|
||||||
|
#include CONFIG_H_FILE
|
||||||
|
#elif defined(HAVE_CONFIG_H)
|
||||||
|
#include "config.h"
|
||||||
|
#else
|
||||||
|
#error Need either CONFIG_H_FILE or HAVE_CONFIG_H defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_HAVE_PCP_PLATFORM_H */
|
||||||
|
|
||||||
101
libpcp/randomart.c
Normal file
101
libpcp/randomart.c
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Draw an ASCII-Art representing the fingerprint so human brain can
|
||||||
|
* profit from its built-in pattern recognition ability.
|
||||||
|
* This technique is called "random art" and can be found in some
|
||||||
|
* scientific publications like this original paper:
|
||||||
|
*
|
||||||
|
* "Hash Visualization: a New Technique to improve Real-World Security",
|
||||||
|
* Perrig A. and Song D., 1999, International Workshop on Cryptographic
|
||||||
|
* Techniques and E-Commerce (CrypTEC '99)
|
||||||
|
* sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
|
||||||
|
*
|
||||||
|
* The subject came up in a talk by Dan Kaminsky, too.
|
||||||
|
*
|
||||||
|
* If you see the picture is different, the key is different.
|
||||||
|
* If the picture looks the same, you still know nothing.
|
||||||
|
*
|
||||||
|
* The algorithm used here is a worm crawling over a discrete plane,
|
||||||
|
* leaving a trace (augmenting the field) everywhere it goes.
|
||||||
|
* Movement is taken from dgst_raw 2bit-wise. Bumping into walls
|
||||||
|
* makes the respective movement vector be ignored for this turn.
|
||||||
|
* Graphs are not unambiguous, because circles in graphs can be
|
||||||
|
* walked in either direction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "randomart.h"
|
||||||
|
|
||||||
|
#define FLDSIZE_Y 8
|
||||||
|
#define FLDSIZE_X FLDSIZE_Y * 2
|
||||||
|
|
||||||
|
char *key_fingerprint_randomart(unsigned char *dgst_raw, unsigned int dgst_raw_len)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Chars to be used after each other every time the worm
|
||||||
|
* intersects with itself. Matter of taste.
|
||||||
|
*/
|
||||||
|
char *augmentation_string = " .o+=*BOX@%&#/^";
|
||||||
|
char *retval, *p;
|
||||||
|
char field[FLDSIZE_X][FLDSIZE_Y];
|
||||||
|
unsigned int i, b;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
retval = ucmalloc((FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
|
||||||
|
|
||||||
|
/* initialize field */
|
||||||
|
memset(field, ' ', FLDSIZE_X * FLDSIZE_Y * sizeof(char));
|
||||||
|
x = FLDSIZE_X / 2;
|
||||||
|
y = FLDSIZE_Y / 2;
|
||||||
|
field[x][y] = '.';
|
||||||
|
|
||||||
|
/* process raw key */
|
||||||
|
for (i = 0; i < dgst_raw_len; i++) {
|
||||||
|
int input;
|
||||||
|
/* each byte conveys four 2-bit move commands */
|
||||||
|
input = dgst_raw[i];
|
||||||
|
for (b = 0; b < 4; b++) {
|
||||||
|
/* evaluate 2 bit, rest is shifted later */
|
||||||
|
x += (input & 0x1) ? 1 : -1;
|
||||||
|
y += (input & 0x2) ? 1 : -1;
|
||||||
|
|
||||||
|
/* assure we are still in bounds */
|
||||||
|
x = MAX(x, 0);
|
||||||
|
y = MAX(y, 0);
|
||||||
|
x = MIN(x, FLDSIZE_X - 1);
|
||||||
|
y = MIN(y, FLDSIZE_Y - 1);
|
||||||
|
|
||||||
|
/* augment the field */
|
||||||
|
p = strchr(augmentation_string, field[x][y]);
|
||||||
|
if (*++p != '\0')
|
||||||
|
field[x][y] = *p;
|
||||||
|
|
||||||
|
input = input >> 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in retval */
|
||||||
|
p = retval;
|
||||||
|
|
||||||
|
/* output upper border */
|
||||||
|
*p++ = '+';
|
||||||
|
for (i = 0; i < FLDSIZE_X; i++)
|
||||||
|
*p++ = '-';
|
||||||
|
*p++ = '+';
|
||||||
|
*p++ = '\n';
|
||||||
|
|
||||||
|
/* output content */
|
||||||
|
for (y = 0; y < FLDSIZE_Y; y++) {
|
||||||
|
*p++ = '|';
|
||||||
|
for (x = 0; x < FLDSIZE_X; x++)
|
||||||
|
*p++ = field[x][y];
|
||||||
|
*p++ = '|';
|
||||||
|
*p++ = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* output lower border */
|
||||||
|
*p++ = '+';
|
||||||
|
for (i = 0; i < FLDSIZE_X; i++)
|
||||||
|
*p++ = '-';
|
||||||
|
*p++ = '+';
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
54
libpcp/randomart.h
Normal file
54
libpcp/randomart.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/* $OpenBSD: key.c,v 1.70 2008/06/11 21:01:35 grunk Exp $ */
|
||||||
|
/*
|
||||||
|
* read_bignum():
|
||||||
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
*
|
||||||
|
* As far as I am concerned, the code I have written for this software
|
||||||
|
* can be used freely for any purpose. Any derived versions of this
|
||||||
|
* software must be clearly marked as such, and if the derived work is
|
||||||
|
* incompatible with the protocol description in the RFC file, it must be
|
||||||
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (c) 2000, 2001 Markus Friedl. 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key_fingerprint_randomart comitted by Alexander von Gernler in rev 1.70
|
||||||
|
|
||||||
|
#ifndef _HAVE_PCP_RANDOMART_H
|
||||||
|
#define _HAVE_PCP_RANDOMART_H
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// from openssh key.c
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
# define MAX(a,b) (((a)>(b))?(a):(b))
|
||||||
|
# define MIN(a,b) (((a)<(b))?(a):(b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
char *key_fingerprint_randomart(unsigned char *dgst_raw, unsigned int dgst_raw_len);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_RANDOMART_H
|
||||||
140
libpcp/sysendian.h
Normal file
140
libpcp/sysendian.h
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2007-2009 Colin Percival
|
||||||
|
* 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file was originally written by Colin Percival as part of the Tarsnap
|
||||||
|
* online backup system.
|
||||||
|
*/
|
||||||
|
#ifndef _SYSENDIAN_H_
|
||||||
|
#define _SYSENDIAN_H_
|
||||||
|
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
/* If we don't have be64enc, the <sys/endian.h> we have isn't usable. */
|
||||||
|
#if !HAVE_DECL_BE64ENC
|
||||||
|
#undef HAVE_SYS_ENDIAN_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_ENDIAN_H
|
||||||
|
|
||||||
|
#include <sys/endian.h>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
be32dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +
|
||||||
|
((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
be32enc(void *pp, uint32_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[3] = x & 0xff;
|
||||||
|
p[2] = (x >> 8) & 0xff;
|
||||||
|
p[1] = (x >> 16) & 0xff;
|
||||||
|
p[0] = (x >> 24) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
be64dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
|
||||||
|
((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
|
||||||
|
((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
|
||||||
|
((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
be64enc(void *pp, uint64_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[7] = x & 0xff;
|
||||||
|
p[6] = (x >> 8) & 0xff;
|
||||||
|
p[5] = (x >> 16) & 0xff;
|
||||||
|
p[4] = (x >> 24) & 0xff;
|
||||||
|
p[3] = (x >> 32) & 0xff;
|
||||||
|
p[2] = (x >> 40) & 0xff;
|
||||||
|
p[1] = (x >> 48) & 0xff;
|
||||||
|
p[0] = (x >> 56) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
le32dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
|
||||||
|
((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
le32enc(void *pp, uint32_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[0] = x & 0xff;
|
||||||
|
p[1] = (x >> 8) & 0xff;
|
||||||
|
p[2] = (x >> 16) & 0xff;
|
||||||
|
p[3] = (x >> 24) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
le64dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) +
|
||||||
|
((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) +
|
||||||
|
((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) +
|
||||||
|
((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
le64enc(void *pp, uint64_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[0] = x & 0xff;
|
||||||
|
p[1] = (x >> 8) & 0xff;
|
||||||
|
p[2] = (x >> 16) & 0xff;
|
||||||
|
p[3] = (x >> 24) & 0xff;
|
||||||
|
p[4] = (x >> 32) & 0xff;
|
||||||
|
p[5] = (x >> 40) & 0xff;
|
||||||
|
p[6] = (x >> 48) & 0xff;
|
||||||
|
p[7] = (x >> 56) & 0xff;
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_SYS_ENDIAN_H */
|
||||||
|
|
||||||
|
#endif /* !_SYSENDIAN_H_ */
|
||||||
948
libpcp/uthash.h
Executable file
948
libpcp/uthash.h
Executable file
@@ -0,0 +1,948 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2003-2013, Troy D. Hanson http://troydhanson.github.com/uthash/
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTHASH_H
|
||||||
|
#define UTHASH_H
|
||||||
|
|
||||||
|
#include <string.h> /* memcmp,strlen */
|
||||||
|
#include <stddef.h> /* ptrdiff_t */
|
||||||
|
#include <stdlib.h> /* exit() */
|
||||||
|
|
||||||
|
/* These macros use decltype or the earlier __typeof GNU extension.
|
||||||
|
As decltype is only available in newer compilers (VS2010 or gcc 4.3+
|
||||||
|
when compiling c++ source) this code uses whatever method is needed
|
||||||
|
or, for VS2008 where neither is available, uses casting workarounds. */
|
||||||
|
#ifdef _MSC_VER /* MS compiler */
|
||||||
|
#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */
|
||||||
|
#define DECLTYPE(x) (decltype(x))
|
||||||
|
#else /* VS2008 or older (or VS2010 in C mode) */
|
||||||
|
#define NO_DECLTYPE
|
||||||
|
#define DECLTYPE(x)
|
||||||
|
#endif
|
||||||
|
#else /* GNU, Sun and other compilers */
|
||||||
|
#define DECLTYPE(x) (__typeof(x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NO_DECLTYPE
|
||||||
|
#define DECLTYPE_ASSIGN(dst,src) \
|
||||||
|
do { \
|
||||||
|
char **_da_dst = (char**)(&(dst)); \
|
||||||
|
*_da_dst = (char*)(src); \
|
||||||
|
} while(0)
|
||||||
|
#else
|
||||||
|
#define DECLTYPE_ASSIGN(dst,src) \
|
||||||
|
do { \
|
||||||
|
(dst) = DECLTYPE(dst)(src); \
|
||||||
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* a number of the hash function use uint32_t which isn't defined on win32 */
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
#else
|
||||||
|
#include <inttypes.h> /* uint32_t */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UTHASH_VERSION 1.9.8
|
||||||
|
|
||||||
|
#ifndef uthash_fatal
|
||||||
|
#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */
|
||||||
|
#endif
|
||||||
|
#ifndef uthash_malloc
|
||||||
|
#define uthash_malloc(sz) malloc(sz) /* malloc fcn */
|
||||||
|
#endif
|
||||||
|
#ifndef uthash_free
|
||||||
|
#define uthash_free(ptr,sz) free(ptr) /* free fcn */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef uthash_noexpand_fyi
|
||||||
|
#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */
|
||||||
|
#endif
|
||||||
|
#ifndef uthash_expand_fyi
|
||||||
|
#define uthash_expand_fyi(tbl) /* can be defined to log expands */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* initial number of buckets */
|
||||||
|
#define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */
|
||||||
|
#define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */
|
||||||
|
#define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */
|
||||||
|
|
||||||
|
/* calculate the element whose hash handle address is hhe */
|
||||||
|
#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))
|
||||||
|
|
||||||
|
#define HASH_FIND(hh,head,keyptr,keylen,out) \
|
||||||
|
do { \
|
||||||
|
unsigned _hf_bkt,_hf_hashv; \
|
||||||
|
out=NULL; \
|
||||||
|
if (head) { \
|
||||||
|
HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \
|
||||||
|
if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \
|
||||||
|
HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \
|
||||||
|
keyptr,keylen,out); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#ifdef HASH_BLOOM
|
||||||
|
#define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM)
|
||||||
|
#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0)
|
||||||
|
#define HASH_BLOOM_MAKE(tbl) \
|
||||||
|
do { \
|
||||||
|
(tbl)->bloom_nbits = HASH_BLOOM; \
|
||||||
|
(tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \
|
||||||
|
if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \
|
||||||
|
memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \
|
||||||
|
(tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define HASH_BLOOM_FREE(tbl) \
|
||||||
|
do { \
|
||||||
|
uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8)))
|
||||||
|
#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8)))
|
||||||
|
|
||||||
|
#define HASH_BLOOM_ADD(tbl,hashv) \
|
||||||
|
HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
|
||||||
|
|
||||||
|
#define HASH_BLOOM_TEST(tbl,hashv) \
|
||||||
|
HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define HASH_BLOOM_MAKE(tbl)
|
||||||
|
#define HASH_BLOOM_FREE(tbl)
|
||||||
|
#define HASH_BLOOM_ADD(tbl,hashv)
|
||||||
|
#define HASH_BLOOM_TEST(tbl,hashv) (1)
|
||||||
|
#define HASH_BLOOM_BYTELEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HASH_MAKE_TABLE(hh,head) \
|
||||||
|
do { \
|
||||||
|
(head)->hh.tbl = (UT_hash_table*)uthash_malloc( \
|
||||||
|
sizeof(UT_hash_table)); \
|
||||||
|
if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \
|
||||||
|
memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \
|
||||||
|
(head)->hh.tbl->tail = &((head)->hh); \
|
||||||
|
(head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \
|
||||||
|
(head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \
|
||||||
|
(head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \
|
||||||
|
(head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \
|
||||||
|
HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \
|
||||||
|
if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \
|
||||||
|
memset((head)->hh.tbl->buckets, 0, \
|
||||||
|
HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \
|
||||||
|
HASH_BLOOM_MAKE((head)->hh.tbl); \
|
||||||
|
(head)->hh.tbl->signature = HASH_SIGNATURE; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_ADD(hh,head,fieldname,keylen_in,add) \
|
||||||
|
HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add)
|
||||||
|
|
||||||
|
#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \
|
||||||
|
do { \
|
||||||
|
replaced=NULL; \
|
||||||
|
HASH_FIND(hh,head,&((add)->fieldname),keylen_in,replaced); \
|
||||||
|
if (replaced!=NULL) { \
|
||||||
|
HASH_DELETE(hh,head,replaced); \
|
||||||
|
}; \
|
||||||
|
HASH_ADD(hh,head,fieldname,keylen_in,add); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \
|
||||||
|
do { \
|
||||||
|
unsigned _ha_bkt; \
|
||||||
|
(add)->hh.next = NULL; \
|
||||||
|
(add)->hh.key = (char*)(keyptr); \
|
||||||
|
(add)->hh.keylen = (unsigned)(keylen_in); \
|
||||||
|
if (!(head)) { \
|
||||||
|
head = (add); \
|
||||||
|
(head)->hh.prev = NULL; \
|
||||||
|
HASH_MAKE_TABLE(hh,head); \
|
||||||
|
} else { \
|
||||||
|
(head)->hh.tbl->tail->next = (add); \
|
||||||
|
(add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \
|
||||||
|
(head)->hh.tbl->tail = &((add)->hh); \
|
||||||
|
} \
|
||||||
|
(head)->hh.tbl->num_items++; \
|
||||||
|
(add)->hh.tbl = (head)->hh.tbl; \
|
||||||
|
HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \
|
||||||
|
(add)->hh.hashv, _ha_bkt); \
|
||||||
|
HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \
|
||||||
|
HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \
|
||||||
|
HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \
|
||||||
|
HASH_FSCK(hh,head); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_TO_BKT( hashv, num_bkts, bkt ) \
|
||||||
|
do { \
|
||||||
|
bkt = ((hashv) & ((num_bkts) - 1)); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* delete "delptr" from the hash table.
|
||||||
|
* "the usual" patch-up process for the app-order doubly-linked-list.
|
||||||
|
* The use of _hd_hh_del below deserves special explanation.
|
||||||
|
* These used to be expressed using (delptr) but that led to a bug
|
||||||
|
* if someone used the same symbol for the head and deletee, like
|
||||||
|
* HASH_DELETE(hh,users,users);
|
||||||
|
* We want that to work, but by changing the head (users) below
|
||||||
|
* we were forfeiting our ability to further refer to the deletee (users)
|
||||||
|
* in the patch-up process. Solution: use scratch space to
|
||||||
|
* copy the deletee pointer, then the latter references are via that
|
||||||
|
* scratch pointer rather than through the repointed (users) symbol.
|
||||||
|
*/
|
||||||
|
#define HASH_DELETE(hh,head,delptr) \
|
||||||
|
do { \
|
||||||
|
unsigned _hd_bkt; \
|
||||||
|
struct UT_hash_handle *_hd_hh_del; \
|
||||||
|
if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \
|
||||||
|
uthash_free((head)->hh.tbl->buckets, \
|
||||||
|
(head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
|
||||||
|
HASH_BLOOM_FREE((head)->hh.tbl); \
|
||||||
|
uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
|
||||||
|
head = NULL; \
|
||||||
|
} else { \
|
||||||
|
_hd_hh_del = &((delptr)->hh); \
|
||||||
|
if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \
|
||||||
|
(head)->hh.tbl->tail = \
|
||||||
|
(UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \
|
||||||
|
(head)->hh.tbl->hho); \
|
||||||
|
} \
|
||||||
|
if ((delptr)->hh.prev) { \
|
||||||
|
((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \
|
||||||
|
(head)->hh.tbl->hho))->next = (delptr)->hh.next; \
|
||||||
|
} else { \
|
||||||
|
DECLTYPE_ASSIGN(head,(delptr)->hh.next); \
|
||||||
|
} \
|
||||||
|
if (_hd_hh_del->next) { \
|
||||||
|
((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next + \
|
||||||
|
(head)->hh.tbl->hho))->prev = \
|
||||||
|
_hd_hh_del->prev; \
|
||||||
|
} \
|
||||||
|
HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
|
||||||
|
HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \
|
||||||
|
(head)->hh.tbl->num_items--; \
|
||||||
|
} \
|
||||||
|
HASH_FSCK(hh,head); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */
|
||||||
|
#define HASH_FIND_STR(head,findstr,out) \
|
||||||
|
HASH_FIND(hh,head,findstr,strlen(findstr),out)
|
||||||
|
#define HASH_ADD_STR(head,strfield,add) \
|
||||||
|
HASH_ADD(hh,head,strfield,strlen(add->strfield),add)
|
||||||
|
#define HASH_REPLACE_STR(head,strfield,add,replaced) \
|
||||||
|
HASH_REPLACE(hh,head,strfield,strlen(add->strfield),add,replaced)
|
||||||
|
#define HASH_FIND_INT(head,findint,out) \
|
||||||
|
HASH_FIND(hh,head,findint,sizeof(int),out)
|
||||||
|
#define HASH_ADD_INT(head,intfield,add) \
|
||||||
|
HASH_ADD(hh,head,intfield,sizeof(int),add)
|
||||||
|
#define HASH_REPLACE_INT(head,intfield,add,replaced) \
|
||||||
|
HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)
|
||||||
|
#define HASH_FIND_PTR(head,findptr,out) \
|
||||||
|
HASH_FIND(hh,head,findptr,sizeof(void *),out)
|
||||||
|
#define HASH_ADD_PTR(head,ptrfield,add) \
|
||||||
|
HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
|
||||||
|
#define HASH_REPLACE_PTR(head,ptrfield,add) \
|
||||||
|
HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)
|
||||||
|
#define HASH_DEL(head,delptr) \
|
||||||
|
HASH_DELETE(hh,head,delptr)
|
||||||
|
|
||||||
|
/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.
|
||||||
|
* This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.
|
||||||
|
*/
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)
|
||||||
|
#define HASH_FSCK(hh,head) \
|
||||||
|
do { \
|
||||||
|
unsigned _bkt_i; \
|
||||||
|
unsigned _count, _bkt_count; \
|
||||||
|
char *_prev; \
|
||||||
|
struct UT_hash_handle *_thh; \
|
||||||
|
if (head) { \
|
||||||
|
_count = 0; \
|
||||||
|
for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \
|
||||||
|
_bkt_count = 0; \
|
||||||
|
_thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \
|
||||||
|
_prev = NULL; \
|
||||||
|
while (_thh) { \
|
||||||
|
if (_prev != (char*)(_thh->hh_prev)) { \
|
||||||
|
HASH_OOPS("invalid hh_prev %p, actual %p\n", \
|
||||||
|
_thh->hh_prev, _prev ); \
|
||||||
|
} \
|
||||||
|
_bkt_count++; \
|
||||||
|
_prev = (char*)(_thh); \
|
||||||
|
_thh = _thh->hh_next; \
|
||||||
|
} \
|
||||||
|
_count += _bkt_count; \
|
||||||
|
if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \
|
||||||
|
HASH_OOPS("invalid bucket count %d, actual %d\n", \
|
||||||
|
(head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
if (_count != (head)->hh.tbl->num_items) { \
|
||||||
|
HASH_OOPS("invalid hh item count %d, actual %d\n", \
|
||||||
|
(head)->hh.tbl->num_items, _count ); \
|
||||||
|
} \
|
||||||
|
/* traverse hh in app order; check next/prev integrity, count */ \
|
||||||
|
_count = 0; \
|
||||||
|
_prev = NULL; \
|
||||||
|
_thh = &(head)->hh; \
|
||||||
|
while (_thh) { \
|
||||||
|
_count++; \
|
||||||
|
if (_prev !=(char*)(_thh->prev)) { \
|
||||||
|
HASH_OOPS("invalid prev %p, actual %p\n", \
|
||||||
|
_thh->prev, _prev ); \
|
||||||
|
} \
|
||||||
|
_prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \
|
||||||
|
_thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \
|
||||||
|
(head)->hh.tbl->hho) : NULL ); \
|
||||||
|
} \
|
||||||
|
if (_count != (head)->hh.tbl->num_items) { \
|
||||||
|
HASH_OOPS("invalid app item count %d, actual %d\n", \
|
||||||
|
(head)->hh.tbl->num_items, _count ); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define HASH_FSCK(hh,head)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to
|
||||||
|
* the descriptor to which this macro is defined for tuning the hash function.
|
||||||
|
* The app can #include <unistd.h> to get the prototype for write(2). */
|
||||||
|
#ifdef HASH_EMIT_KEYS
|
||||||
|
#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \
|
||||||
|
do { \
|
||||||
|
unsigned _klen = fieldlen; \
|
||||||
|
write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \
|
||||||
|
write(HASH_EMIT_KEYS, keyptr, fieldlen); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */
|
||||||
|
#ifdef HASH_FUNCTION
|
||||||
|
#define HASH_FCN HASH_FUNCTION
|
||||||
|
#else
|
||||||
|
#define HASH_FCN HASH_JEN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The Bernstein hash function, used in Perl prior to v5.6 */
|
||||||
|
#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned _hb_keylen=keylen; \
|
||||||
|
char *_hb_key=(char*)(key); \
|
||||||
|
(hashv) = 0; \
|
||||||
|
while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \
|
||||||
|
bkt = (hashv) & (num_bkts-1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at
|
||||||
|
* http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */
|
||||||
|
#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned _sx_i; \
|
||||||
|
char *_hs_key=(char*)(key); \
|
||||||
|
hashv = 0; \
|
||||||
|
for(_sx_i=0; _sx_i < keylen; _sx_i++) \
|
||||||
|
hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned _fn_i; \
|
||||||
|
char *_hf_key=(char*)(key); \
|
||||||
|
hashv = 2166136261UL; \
|
||||||
|
for(_fn_i=0; _fn_i < keylen; _fn_i++) \
|
||||||
|
hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned _ho_i; \
|
||||||
|
char *_ho_key=(char*)(key); \
|
||||||
|
hashv = 0; \
|
||||||
|
for(_ho_i=0; _ho_i < keylen; _ho_i++) { \
|
||||||
|
hashv += _ho_key[_ho_i]; \
|
||||||
|
hashv += (hashv << 10); \
|
||||||
|
hashv ^= (hashv >> 6); \
|
||||||
|
} \
|
||||||
|
hashv += (hashv << 3); \
|
||||||
|
hashv ^= (hashv >> 11); \
|
||||||
|
hashv += (hashv << 15); \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_JEN_MIX(a,b,c) \
|
||||||
|
do { \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 13 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 8 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 13 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 12 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 16 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 5 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 3 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 10 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 15 ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned _hj_i,_hj_j,_hj_k; \
|
||||||
|
unsigned char *_hj_key=(unsigned char*)(key); \
|
||||||
|
hashv = 0xfeedbeef; \
|
||||||
|
_hj_i = _hj_j = 0x9e3779b9; \
|
||||||
|
_hj_k = (unsigned)(keylen); \
|
||||||
|
while (_hj_k >= 12) { \
|
||||||
|
_hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \
|
||||||
|
+ ( (unsigned)_hj_key[2] << 16 ) \
|
||||||
|
+ ( (unsigned)_hj_key[3] << 24 ) ); \
|
||||||
|
_hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \
|
||||||
|
+ ( (unsigned)_hj_key[6] << 16 ) \
|
||||||
|
+ ( (unsigned)_hj_key[7] << 24 ) ); \
|
||||||
|
hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \
|
||||||
|
+ ( (unsigned)_hj_key[10] << 16 ) \
|
||||||
|
+ ( (unsigned)_hj_key[11] << 24 ) ); \
|
||||||
|
\
|
||||||
|
HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
|
||||||
|
\
|
||||||
|
_hj_key += 12; \
|
||||||
|
_hj_k -= 12; \
|
||||||
|
} \
|
||||||
|
hashv += keylen; \
|
||||||
|
switch ( _hj_k ) { \
|
||||||
|
case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \
|
||||||
|
case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \
|
||||||
|
case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \
|
||||||
|
case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \
|
||||||
|
case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \
|
||||||
|
case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \
|
||||||
|
case 5: _hj_j += _hj_key[4]; \
|
||||||
|
case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \
|
||||||
|
case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \
|
||||||
|
case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \
|
||||||
|
case 1: _hj_i += _hj_key[0]; \
|
||||||
|
} \
|
||||||
|
HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* The Paul Hsieh hash function */
|
||||||
|
#undef get16bits
|
||||||
|
#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
|
||||||
|
|| defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
|
||||||
|
#define get16bits(d) (*((const uint16_t *) (d)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined (get16bits)
|
||||||
|
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \
|
||||||
|
+(uint32_t)(((const uint8_t *)(d))[0]) )
|
||||||
|
#endif
|
||||||
|
#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
unsigned char *_sfh_key=(unsigned char*)(key); \
|
||||||
|
uint32_t _sfh_tmp, _sfh_len = keylen; \
|
||||||
|
\
|
||||||
|
int _sfh_rem = _sfh_len & 3; \
|
||||||
|
_sfh_len >>= 2; \
|
||||||
|
hashv = 0xcafebabe; \
|
||||||
|
\
|
||||||
|
/* Main loop */ \
|
||||||
|
for (;_sfh_len > 0; _sfh_len--) { \
|
||||||
|
hashv += get16bits (_sfh_key); \
|
||||||
|
_sfh_tmp = (uint32_t)(get16bits (_sfh_key+2)) << 11 ^ hashv; \
|
||||||
|
hashv = (hashv << 16) ^ _sfh_tmp; \
|
||||||
|
_sfh_key += 2*sizeof (uint16_t); \
|
||||||
|
hashv += hashv >> 11; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
/* Handle end cases */ \
|
||||||
|
switch (_sfh_rem) { \
|
||||||
|
case 3: hashv += get16bits (_sfh_key); \
|
||||||
|
hashv ^= hashv << 16; \
|
||||||
|
hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)] << 18); \
|
||||||
|
hashv += hashv >> 11; \
|
||||||
|
break; \
|
||||||
|
case 2: hashv += get16bits (_sfh_key); \
|
||||||
|
hashv ^= hashv << 11; \
|
||||||
|
hashv += hashv >> 17; \
|
||||||
|
break; \
|
||||||
|
case 1: hashv += *_sfh_key; \
|
||||||
|
hashv ^= hashv << 10; \
|
||||||
|
hashv += hashv >> 1; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
/* Force "avalanching" of final 127 bits */ \
|
||||||
|
hashv ^= hashv << 3; \
|
||||||
|
hashv += hashv >> 5; \
|
||||||
|
hashv ^= hashv << 4; \
|
||||||
|
hashv += hashv >> 17; \
|
||||||
|
hashv ^= hashv << 25; \
|
||||||
|
hashv += hashv >> 6; \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#ifdef HASH_USING_NO_STRICT_ALIASING
|
||||||
|
/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.
|
||||||
|
* For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.
|
||||||
|
* MurmurHash uses the faster approach only on CPU's where we know it's safe.
|
||||||
|
*
|
||||||
|
* Note the preprocessor built-in defines can be emitted using:
|
||||||
|
*
|
||||||
|
* gcc -m64 -dM -E - < /dev/null (on gcc)
|
||||||
|
* cc -## a.c (where a.c is a simple test file) (Sun Studio)
|
||||||
|
*/
|
||||||
|
#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86))
|
||||||
|
#define MUR_GETBLOCK(p,i) p[i]
|
||||||
|
#else /* non intel */
|
||||||
|
#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 0x3) == 0)
|
||||||
|
#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 0x3) == 1)
|
||||||
|
#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 0x3) == 2)
|
||||||
|
#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 0x3) == 3)
|
||||||
|
#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))
|
||||||
|
#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))
|
||||||
|
#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))
|
||||||
|
#define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))
|
||||||
|
#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8))
|
||||||
|
#else /* assume little endian non-intel */
|
||||||
|
#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))
|
||||||
|
#define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))
|
||||||
|
#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8))
|
||||||
|
#endif
|
||||||
|
#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \
|
||||||
|
(MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \
|
||||||
|
(MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \
|
||||||
|
MUR_ONE_THREE(p))))
|
||||||
|
#endif
|
||||||
|
#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))
|
||||||
|
#define MUR_FMIX(_h) \
|
||||||
|
do { \
|
||||||
|
_h ^= _h >> 16; \
|
||||||
|
_h *= 0x85ebca6b; \
|
||||||
|
_h ^= _h >> 13; \
|
||||||
|
_h *= 0xc2b2ae35l; \
|
||||||
|
_h ^= _h >> 16; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \
|
||||||
|
do { \
|
||||||
|
const uint8_t *_mur_data = (const uint8_t*)(key); \
|
||||||
|
const int _mur_nblocks = (keylen) / 4; \
|
||||||
|
uint32_t _mur_h1 = 0xf88D5353; \
|
||||||
|
uint32_t _mur_c1 = 0xcc9e2d51; \
|
||||||
|
uint32_t _mur_c2 = 0x1b873593; \
|
||||||
|
uint32_t _mur_k1 = 0; \
|
||||||
|
const uint8_t *_mur_tail; \
|
||||||
|
const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+_mur_nblocks*4); \
|
||||||
|
int _mur_i; \
|
||||||
|
for(_mur_i = -_mur_nblocks; _mur_i; _mur_i++) { \
|
||||||
|
_mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \
|
||||||
|
_mur_k1 *= _mur_c1; \
|
||||||
|
_mur_k1 = MUR_ROTL32(_mur_k1,15); \
|
||||||
|
_mur_k1 *= _mur_c2; \
|
||||||
|
\
|
||||||
|
_mur_h1 ^= _mur_k1; \
|
||||||
|
_mur_h1 = MUR_ROTL32(_mur_h1,13); \
|
||||||
|
_mur_h1 = _mur_h1*5+0xe6546b64; \
|
||||||
|
} \
|
||||||
|
_mur_tail = (const uint8_t*)(_mur_data + _mur_nblocks*4); \
|
||||||
|
_mur_k1=0; \
|
||||||
|
switch((keylen) & 3) { \
|
||||||
|
case 3: _mur_k1 ^= _mur_tail[2] << 16; \
|
||||||
|
case 2: _mur_k1 ^= _mur_tail[1] << 8; \
|
||||||
|
case 1: _mur_k1 ^= _mur_tail[0]; \
|
||||||
|
_mur_k1 *= _mur_c1; \
|
||||||
|
_mur_k1 = MUR_ROTL32(_mur_k1,15); \
|
||||||
|
_mur_k1 *= _mur_c2; \
|
||||||
|
_mur_h1 ^= _mur_k1; \
|
||||||
|
} \
|
||||||
|
_mur_h1 ^= (keylen); \
|
||||||
|
MUR_FMIX(_mur_h1); \
|
||||||
|
hashv = _mur_h1; \
|
||||||
|
bkt = hashv & (num_bkts-1); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* HASH_USING_NO_STRICT_ALIASING */
|
||||||
|
|
||||||
|
/* key comparison function; return 0 if keys equal */
|
||||||
|
#define HASH_KEYCMP(a,b,len) memcmp(a,b,len)
|
||||||
|
|
||||||
|
/* iterate over items in a known bucket to find desired item */
|
||||||
|
#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \
|
||||||
|
do { \
|
||||||
|
if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \
|
||||||
|
else out=NULL; \
|
||||||
|
while (out) { \
|
||||||
|
if ((out)->hh.keylen == keylen_in) { \
|
||||||
|
if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) break; \
|
||||||
|
} \
|
||||||
|
if ((out)->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); \
|
||||||
|
else out = NULL; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* add an item to a bucket */
|
||||||
|
#define HASH_ADD_TO_BKT(head,addhh) \
|
||||||
|
do { \
|
||||||
|
head.count++; \
|
||||||
|
(addhh)->hh_next = head.hh_head; \
|
||||||
|
(addhh)->hh_prev = NULL; \
|
||||||
|
if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \
|
||||||
|
(head).hh_head=addhh; \
|
||||||
|
if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \
|
||||||
|
&& (addhh)->tbl->noexpand != 1) { \
|
||||||
|
HASH_EXPAND_BUCKETS((addhh)->tbl); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* remove an item from a given bucket */
|
||||||
|
#define HASH_DEL_IN_BKT(hh,head,hh_del) \
|
||||||
|
(head).count--; \
|
||||||
|
if ((head).hh_head == hh_del) { \
|
||||||
|
(head).hh_head = hh_del->hh_next; \
|
||||||
|
} \
|
||||||
|
if (hh_del->hh_prev) { \
|
||||||
|
hh_del->hh_prev->hh_next = hh_del->hh_next; \
|
||||||
|
} \
|
||||||
|
if (hh_del->hh_next) { \
|
||||||
|
hh_del->hh_next->hh_prev = hh_del->hh_prev; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bucket expansion has the effect of doubling the number of buckets
|
||||||
|
* and redistributing the items into the new buckets. Ideally the
|
||||||
|
* items will distribute more or less evenly into the new buckets
|
||||||
|
* (the extent to which this is true is a measure of the quality of
|
||||||
|
* the hash function as it applies to the key domain).
|
||||||
|
*
|
||||||
|
* With the items distributed into more buckets, the chain length
|
||||||
|
* (item count) in each bucket is reduced. Thus by expanding buckets
|
||||||
|
* the hash keeps a bound on the chain length. This bounded chain
|
||||||
|
* length is the essence of how a hash provides constant time lookup.
|
||||||
|
*
|
||||||
|
* The calculation of tbl->ideal_chain_maxlen below deserves some
|
||||||
|
* explanation. First, keep in mind that we're calculating the ideal
|
||||||
|
* maximum chain length based on the *new* (doubled) bucket count.
|
||||||
|
* In fractions this is just n/b (n=number of items,b=new num buckets).
|
||||||
|
* Since the ideal chain length is an integer, we want to calculate
|
||||||
|
* ceil(n/b). We don't depend on floating point arithmetic in this
|
||||||
|
* hash, so to calculate ceil(n/b) with integers we could write
|
||||||
|
*
|
||||||
|
* ceil(n/b) = (n/b) + ((n%b)?1:0)
|
||||||
|
*
|
||||||
|
* and in fact a previous version of this hash did just that.
|
||||||
|
* But now we have improved things a bit by recognizing that b is
|
||||||
|
* always a power of two. We keep its base 2 log handy (call it lb),
|
||||||
|
* so now we can write this with a bit shift and logical AND:
|
||||||
|
*
|
||||||
|
* ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define HASH_EXPAND_BUCKETS(tbl) \
|
||||||
|
do { \
|
||||||
|
unsigned _he_bkt; \
|
||||||
|
unsigned _he_bkt_i; \
|
||||||
|
struct UT_hash_handle *_he_thh, *_he_hh_nxt; \
|
||||||
|
UT_hash_bucket *_he_new_buckets, *_he_newbkt; \
|
||||||
|
_he_new_buckets = (UT_hash_bucket*)uthash_malloc( \
|
||||||
|
2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
|
||||||
|
if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \
|
||||||
|
memset(_he_new_buckets, 0, \
|
||||||
|
2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
|
||||||
|
tbl->ideal_chain_maxlen = \
|
||||||
|
(tbl->num_items >> (tbl->log2_num_buckets+1)) + \
|
||||||
|
((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \
|
||||||
|
tbl->nonideal_items = 0; \
|
||||||
|
for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \
|
||||||
|
{ \
|
||||||
|
_he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \
|
||||||
|
while (_he_thh) { \
|
||||||
|
_he_hh_nxt = _he_thh->hh_next; \
|
||||||
|
HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \
|
||||||
|
_he_newbkt = &(_he_new_buckets[ _he_bkt ]); \
|
||||||
|
if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \
|
||||||
|
tbl->nonideal_items++; \
|
||||||
|
_he_newbkt->expand_mult = _he_newbkt->count / \
|
||||||
|
tbl->ideal_chain_maxlen; \
|
||||||
|
} \
|
||||||
|
_he_thh->hh_prev = NULL; \
|
||||||
|
_he_thh->hh_next = _he_newbkt->hh_head; \
|
||||||
|
if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \
|
||||||
|
_he_thh; \
|
||||||
|
_he_newbkt->hh_head = _he_thh; \
|
||||||
|
_he_thh = _he_hh_nxt; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
|
||||||
|
tbl->num_buckets *= 2; \
|
||||||
|
tbl->log2_num_buckets++; \
|
||||||
|
tbl->buckets = _he_new_buckets; \
|
||||||
|
tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \
|
||||||
|
(tbl->ineff_expands+1) : 0; \
|
||||||
|
if (tbl->ineff_expands > 1) { \
|
||||||
|
tbl->noexpand=1; \
|
||||||
|
uthash_noexpand_fyi(tbl); \
|
||||||
|
} \
|
||||||
|
uthash_expand_fyi(tbl); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */
|
||||||
|
/* Note that HASH_SORT assumes the hash handle name to be hh.
|
||||||
|
* HASH_SRT was added to allow the hash handle name to be passed in. */
|
||||||
|
#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
|
||||||
|
#define HASH_SRT(hh,head,cmpfcn) \
|
||||||
|
do { \
|
||||||
|
unsigned _hs_i; \
|
||||||
|
unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \
|
||||||
|
struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \
|
||||||
|
if (head) { \
|
||||||
|
_hs_insize = 1; \
|
||||||
|
_hs_looping = 1; \
|
||||||
|
_hs_list = &((head)->hh); \
|
||||||
|
while (_hs_looping) { \
|
||||||
|
_hs_p = _hs_list; \
|
||||||
|
_hs_list = NULL; \
|
||||||
|
_hs_tail = NULL; \
|
||||||
|
_hs_nmerges = 0; \
|
||||||
|
while (_hs_p) { \
|
||||||
|
_hs_nmerges++; \
|
||||||
|
_hs_q = _hs_p; \
|
||||||
|
_hs_psize = 0; \
|
||||||
|
for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \
|
||||||
|
_hs_psize++; \
|
||||||
|
_hs_q = (UT_hash_handle*)((_hs_q->next) ? \
|
||||||
|
((void*)((char*)(_hs_q->next) + \
|
||||||
|
(head)->hh.tbl->hho)) : NULL); \
|
||||||
|
if (! (_hs_q) ) break; \
|
||||||
|
} \
|
||||||
|
_hs_qsize = _hs_insize; \
|
||||||
|
while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \
|
||||||
|
if (_hs_psize == 0) { \
|
||||||
|
_hs_e = _hs_q; \
|
||||||
|
_hs_q = (UT_hash_handle*)((_hs_q->next) ? \
|
||||||
|
((void*)((char*)(_hs_q->next) + \
|
||||||
|
(head)->hh.tbl->hho)) : NULL); \
|
||||||
|
_hs_qsize--; \
|
||||||
|
} else if ( (_hs_qsize == 0) || !(_hs_q) ) { \
|
||||||
|
_hs_e = _hs_p; \
|
||||||
|
if (_hs_p){ \
|
||||||
|
_hs_p = (UT_hash_handle*)((_hs_p->next) ? \
|
||||||
|
((void*)((char*)(_hs_p->next) + \
|
||||||
|
(head)->hh.tbl->hho)) : NULL); \
|
||||||
|
} \
|
||||||
|
_hs_psize--; \
|
||||||
|
} else if (( \
|
||||||
|
cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \
|
||||||
|
DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \
|
||||||
|
) <= 0) { \
|
||||||
|
_hs_e = _hs_p; \
|
||||||
|
if (_hs_p){ \
|
||||||
|
_hs_p = (UT_hash_handle*)((_hs_p->next) ? \
|
||||||
|
((void*)((char*)(_hs_p->next) + \
|
||||||
|
(head)->hh.tbl->hho)) : NULL); \
|
||||||
|
} \
|
||||||
|
_hs_psize--; \
|
||||||
|
} else { \
|
||||||
|
_hs_e = _hs_q; \
|
||||||
|
_hs_q = (UT_hash_handle*)((_hs_q->next) ? \
|
||||||
|
((void*)((char*)(_hs_q->next) + \
|
||||||
|
(head)->hh.tbl->hho)) : NULL); \
|
||||||
|
_hs_qsize--; \
|
||||||
|
} \
|
||||||
|
if ( _hs_tail ) { \
|
||||||
|
_hs_tail->next = ((_hs_e) ? \
|
||||||
|
ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \
|
||||||
|
} else { \
|
||||||
|
_hs_list = _hs_e; \
|
||||||
|
} \
|
||||||
|
if (_hs_e) { \
|
||||||
|
_hs_e->prev = ((_hs_tail) ? \
|
||||||
|
ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \
|
||||||
|
} \
|
||||||
|
_hs_tail = _hs_e; \
|
||||||
|
} \
|
||||||
|
_hs_p = _hs_q; \
|
||||||
|
} \
|
||||||
|
if (_hs_tail){ \
|
||||||
|
_hs_tail->next = NULL; \
|
||||||
|
} \
|
||||||
|
if ( _hs_nmerges <= 1 ) { \
|
||||||
|
_hs_looping=0; \
|
||||||
|
(head)->hh.tbl->tail = _hs_tail; \
|
||||||
|
DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \
|
||||||
|
} \
|
||||||
|
_hs_insize *= 2; \
|
||||||
|
} \
|
||||||
|
HASH_FSCK(hh,head); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* This function selects items from one hash into another hash.
|
||||||
|
* The end result is that the selected items have dual presence
|
||||||
|
* in both hashes. There is no copy of the items made; rather
|
||||||
|
* they are added into the new hash through a secondary hash
|
||||||
|
* hash handle that must be present in the structure. */
|
||||||
|
#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \
|
||||||
|
do { \
|
||||||
|
unsigned _src_bkt, _dst_bkt; \
|
||||||
|
void *_last_elt=NULL, *_elt; \
|
||||||
|
UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \
|
||||||
|
ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \
|
||||||
|
if (src) { \
|
||||||
|
for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \
|
||||||
|
for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \
|
||||||
|
_src_hh; \
|
||||||
|
_src_hh = _src_hh->hh_next) { \
|
||||||
|
_elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \
|
||||||
|
if (cond(_elt)) { \
|
||||||
|
_dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \
|
||||||
|
_dst_hh->key = _src_hh->key; \
|
||||||
|
_dst_hh->keylen = _src_hh->keylen; \
|
||||||
|
_dst_hh->hashv = _src_hh->hashv; \
|
||||||
|
_dst_hh->prev = _last_elt; \
|
||||||
|
_dst_hh->next = NULL; \
|
||||||
|
if (_last_elt_hh) { _last_elt_hh->next = _elt; } \
|
||||||
|
if (!dst) { \
|
||||||
|
DECLTYPE_ASSIGN(dst,_elt); \
|
||||||
|
HASH_MAKE_TABLE(hh_dst,dst); \
|
||||||
|
} else { \
|
||||||
|
_dst_hh->tbl = (dst)->hh_dst.tbl; \
|
||||||
|
} \
|
||||||
|
HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \
|
||||||
|
HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \
|
||||||
|
(dst)->hh_dst.tbl->num_items++; \
|
||||||
|
_last_elt = _elt; \
|
||||||
|
_last_elt_hh = _dst_hh; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
HASH_FSCK(hh_dst,dst); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define HASH_CLEAR(hh,head) \
|
||||||
|
do { \
|
||||||
|
if (head) { \
|
||||||
|
uthash_free((head)->hh.tbl->buckets, \
|
||||||
|
(head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \
|
||||||
|
HASH_BLOOM_FREE((head)->hh.tbl); \
|
||||||
|
uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
|
||||||
|
(head)=NULL; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define HASH_OVERHEAD(hh,head) \
|
||||||
|
(size_t)((((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \
|
||||||
|
((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \
|
||||||
|
(sizeof(UT_hash_table)) + \
|
||||||
|
(HASH_BLOOM_BYTELEN)))
|
||||||
|
|
||||||
|
#ifdef NO_DECLTYPE
|
||||||
|
#define HASH_ITER(hh,head,el,tmp) \
|
||||||
|
for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \
|
||||||
|
el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL))
|
||||||
|
#else
|
||||||
|
#define HASH_ITER(hh,head,el,tmp) \
|
||||||
|
for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \
|
||||||
|
el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* obtain a count of items in the hash */
|
||||||
|
#define HASH_COUNT(head) HASH_CNT(hh,head)
|
||||||
|
#define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0)
|
||||||
|
|
||||||
|
typedef struct UT_hash_bucket {
|
||||||
|
struct UT_hash_handle *hh_head;
|
||||||
|
unsigned count;
|
||||||
|
|
||||||
|
/* expand_mult is normally set to 0. In this situation, the max chain length
|
||||||
|
* threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
|
||||||
|
* the bucket's chain exceeds this length, bucket expansion is triggered).
|
||||||
|
* However, setting expand_mult to a non-zero value delays bucket expansion
|
||||||
|
* (that would be triggered by additions to this particular bucket)
|
||||||
|
* until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
|
||||||
|
* (The multiplier is simply expand_mult+1). The whole idea of this
|
||||||
|
* multiplier is to reduce bucket expansions, since they are expensive, in
|
||||||
|
* situations where we know that a particular bucket tends to be overused.
|
||||||
|
* It is better to let its chain length grow to a longer yet-still-bounded
|
||||||
|
* value, than to do an O(n) bucket expansion too often.
|
||||||
|
*/
|
||||||
|
unsigned expand_mult;
|
||||||
|
|
||||||
|
} UT_hash_bucket;
|
||||||
|
|
||||||
|
/* random signature used only to find hash tables in external analysis */
|
||||||
|
#define HASH_SIGNATURE 0xa0111fe1
|
||||||
|
#define HASH_BLOOM_SIGNATURE 0xb12220f2
|
||||||
|
|
||||||
|
typedef struct UT_hash_table {
|
||||||
|
UT_hash_bucket *buckets;
|
||||||
|
unsigned num_buckets, log2_num_buckets;
|
||||||
|
unsigned num_items;
|
||||||
|
struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
|
||||||
|
ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
|
||||||
|
|
||||||
|
/* in an ideal situation (all buckets used equally), no bucket would have
|
||||||
|
* more than ceil(#items/#buckets) items. that's the ideal chain length. */
|
||||||
|
unsigned ideal_chain_maxlen;
|
||||||
|
|
||||||
|
/* nonideal_items is the number of items in the hash whose chain position
|
||||||
|
* exceeds the ideal chain maxlen. these items pay the penalty for an uneven
|
||||||
|
* hash distribution; reaching them in a chain traversal takes >ideal steps */
|
||||||
|
unsigned nonideal_items;
|
||||||
|
|
||||||
|
/* ineffective expands occur when a bucket doubling was performed, but
|
||||||
|
* afterward, more than half the items in the hash had nonideal chain
|
||||||
|
* positions. If this happens on two consecutive expansions we inhibit any
|
||||||
|
* further expansion, as it's not helping; this happens when the hash
|
||||||
|
* function isn't a good fit for the key domain. When expansion is inhibited
|
||||||
|
* the hash will still work, albeit no longer in constant time. */
|
||||||
|
unsigned ineff_expands, noexpand;
|
||||||
|
|
||||||
|
uint32_t signature; /* used only to find hash tables in external analysis */
|
||||||
|
#ifdef HASH_BLOOM
|
||||||
|
uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
|
||||||
|
uint8_t *bloom_bv;
|
||||||
|
char bloom_nbits;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} UT_hash_table;
|
||||||
|
|
||||||
|
typedef struct UT_hash_handle {
|
||||||
|
struct UT_hash_table *tbl;
|
||||||
|
void *prev; /* prev element in app order */
|
||||||
|
void *next; /* next element in app order */
|
||||||
|
struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
|
||||||
|
struct UT_hash_handle *hh_next; /* next hh in bucket order */
|
||||||
|
void *key; /* ptr to enclosing struct's key */
|
||||||
|
unsigned keylen; /* enclosing struct's key len */
|
||||||
|
unsigned hashv; /* result of hash-fcn(key) */
|
||||||
|
} UT_hash_handle;
|
||||||
|
|
||||||
|
#endif /* UTHASH_H */
|
||||||
397
libpcp/vault.c
Normal file
397
libpcp/vault.c
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
#include "vault.h"
|
||||||
|
|
||||||
|
vault_t *pcpvault_init(char *filename) {
|
||||||
|
vault_t *vault = pcpvault_new(filename, 0);
|
||||||
|
if(vault != NULL) {
|
||||||
|
if(vault->isnew == 1) {
|
||||||
|
if(pcpvault_create(vault) != 0) {
|
||||||
|
pcpvault_close(vault);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(pcpvault_fetchall(vault) != 0) {
|
||||||
|
errno = 0; // weird, something sets it to ENOENT and it's not me
|
||||||
|
pcpvault_close(vault);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vault;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault_t *pcpvault_new(char *filename, int is_tmp) {
|
||||||
|
vault_t *vault = ucmalloc(sizeof(vault_t));
|
||||||
|
FILE *fd;
|
||||||
|
struct stat stat_buf;
|
||||||
|
|
||||||
|
if(is_tmp) {
|
||||||
|
filename = ucmalloc(1024);
|
||||||
|
uint32_t a,b;
|
||||||
|
while (1) {
|
||||||
|
a = arc4random();
|
||||||
|
b = arc4random();
|
||||||
|
snprintf(filename, 1024, "%s/.pcpvault-%08x%08x", getenv("HOME"), a, b);
|
||||||
|
if (stat (filename, &stat_buf) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
unlink(filename);
|
||||||
|
vault->size = 0;
|
||||||
|
vault->modified = 0;
|
||||||
|
vault->mode = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (stat (filename, &stat_buf) == 0) {
|
||||||
|
vault->size = stat_buf.st_size;
|
||||||
|
vault->modified = stat_buf.st_mtime;
|
||||||
|
vault->mode = stat_buf.st_mode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vault->size = 0;
|
||||||
|
vault->modified = 0;
|
||||||
|
vault->mode = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vault->size == 0) {
|
||||||
|
vault->isnew = 1;
|
||||||
|
mode_t old_mask = umask (S_IWGRP | S_IWOTH | S_IRGRP | S_IROTH);
|
||||||
|
if((fd = fopen(filename, "wb+")) == NULL) {
|
||||||
|
fatal("Could not create vault file %s", filename);
|
||||||
|
umask (old_mask);
|
||||||
|
goto errn;
|
||||||
|
}
|
||||||
|
umask (old_mask);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if((fd = fopen(filename, "rb+")) == NULL) {
|
||||||
|
fatal("Could not open vault file %s", filename);
|
||||||
|
goto errn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vault->fd = fd;
|
||||||
|
vault->filename = filename;
|
||||||
|
vault->unsafed = 0;
|
||||||
|
|
||||||
|
return vault;
|
||||||
|
|
||||||
|
errn:
|
||||||
|
free(vault);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcpvault_create(vault_t *vault) {
|
||||||
|
vault_header_t *header = ucmalloc(sizeof(vault_header_t));
|
||||||
|
header->fileid = PCP_VAULT_ID;
|
||||||
|
header->version = PCP_VAULT_VERSION;
|
||||||
|
|
||||||
|
vault->version = header->version;
|
||||||
|
memcpy(vault->checksum, header->checksum, 32);
|
||||||
|
|
||||||
|
vh2be(header);
|
||||||
|
|
||||||
|
fseek(vault->fd, 0, SEEK_SET);
|
||||||
|
|
||||||
|
fwrite(header, sizeof(vault_header_t), 1, vault->fd);
|
||||||
|
|
||||||
|
if(ferror(vault->fd) != 0) {
|
||||||
|
fatal("Failed to write fileheader to vault %s!\n", vault->filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault->unsafed = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcpvault_additem(vault_t *vault, void *item, size_t itemsize, uint8_t type, uint8_t do_hash) {
|
||||||
|
vault_item_header_t *header = ucmalloc(sizeof(vault_item_header_t));
|
||||||
|
header->type = type;
|
||||||
|
header->size = itemsize;
|
||||||
|
|
||||||
|
crypto_hash_sha256((unsigned char*)header->checksum, item, itemsize);
|
||||||
|
ih2be(header);
|
||||||
|
|
||||||
|
void *saveitem = ucmalloc(itemsize);
|
||||||
|
memcpy(saveitem, item, itemsize);
|
||||||
|
|
||||||
|
if(type == PCP_KEY_TYPE_PUBLIC)
|
||||||
|
pubkey2be((pcp_pubkey_t *)saveitem);
|
||||||
|
else
|
||||||
|
key2be((pcp_key_t *)saveitem);
|
||||||
|
|
||||||
|
fwrite(header, sizeof(vault_item_header_t), 1, vault->fd);
|
||||||
|
fwrite(saveitem, itemsize, 1, vault->fd);
|
||||||
|
|
||||||
|
bzero(saveitem, itemsize);
|
||||||
|
free(saveitem);
|
||||||
|
|
||||||
|
if(do_hash == 1) {
|
||||||
|
// we don't re-hash if it's a full update
|
||||||
|
if(type == PCP_KEY_TYPE_PUBLIC) {
|
||||||
|
pcp_pubkey_t *p = (pcp_pubkey_t *)item;
|
||||||
|
HASH_ADD_STR( pcppubkey_hash, id, p );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcp_key_t *s = (pcp_key_t *)item;
|
||||||
|
HASH_ADD_STR( pcpkey_hash, id, s );
|
||||||
|
}
|
||||||
|
pcpvault_update_checksum(vault);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ferror(vault->fd) != 0) {
|
||||||
|
fatal("Failed to add an item to vault %s!\n", vault->filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault->unsafed = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcpvault_writeall(vault_t *vault) {
|
||||||
|
vault_t *tmp = pcpvault_new(NULL, 1); // FIXME
|
||||||
|
if(tmp != NULL) {
|
||||||
|
if(pcpvault_create(tmp) == 0) {
|
||||||
|
pcp_key_t *k, *kt = NULL;
|
||||||
|
HASH_ITER(hh, pcpkey_hash, k, kt) {
|
||||||
|
if(pcpvault_additem(tmp, (void *)k, sizeof(pcp_key_t), PCP_KEY_TYPE_SECRET, 0) != 0)
|
||||||
|
goto errwa;
|
||||||
|
}
|
||||||
|
pcp_pubkey_t *p, *pt = NULL;
|
||||||
|
HASH_ITER(hh, pcppubkey_hash, p, pt) {
|
||||||
|
if(pcpvault_additem(tmp, (void *)p, sizeof(pcp_pubkey_t), PCP_KEY_TYPE_PUBLIC, 0) != 0)
|
||||||
|
goto errwa;
|
||||||
|
}
|
||||||
|
pcpvault_update_checksum(tmp);
|
||||||
|
pcpvault_copy(tmp, vault);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errwa:
|
||||||
|
if(tmp != NULL) {
|
||||||
|
pcpvault_unlink(tmp);
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpvault_update_checksum(vault_t *vault) {
|
||||||
|
unsigned char *checksum = pcpvault_create_checksum(vault);
|
||||||
|
|
||||||
|
vault_header_t *header = ucmalloc(sizeof(vault_header_t));
|
||||||
|
header->fileid = PCP_VAULT_ID;
|
||||||
|
header->version = PCP_VAULT_VERSION;
|
||||||
|
memcpy(header->checksum, checksum, 32);
|
||||||
|
memcpy(vault->checksum, checksum, 32);
|
||||||
|
|
||||||
|
vh2be(header);
|
||||||
|
|
||||||
|
fseek(vault->fd, 0, SEEK_SET);
|
||||||
|
fwrite(header, sizeof(vault_header_t), 1, vault->fd);
|
||||||
|
fseek(vault->fd, 0, SEEK_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *pcpvault_create_checksum(vault_t *vault) {
|
||||||
|
size_t skeysize = sizeof(pcp_key_t) - sizeof(UT_hash_handle);
|
||||||
|
size_t pkeysize = sizeof(pcp_pubkey_t) - sizeof(UT_hash_handle);
|
||||||
|
|
||||||
|
int numskeys = HASH_COUNT(pcpkey_hash);
|
||||||
|
int numpkeys = HASH_COUNT(pcppubkey_hash);
|
||||||
|
|
||||||
|
size_t datasize = (skeysize * numskeys) + (pkeysize * numpkeys);
|
||||||
|
unsigned char *data = ucmalloc(datasize);
|
||||||
|
unsigned char *checksum = ucmalloc(32);
|
||||||
|
size_t datapos = 0;
|
||||||
|
|
||||||
|
pcp_key_t *k, *kt = NULL;
|
||||||
|
HASH_ITER(hh, pcpkey_hash, k, kt) {
|
||||||
|
key2be(k);
|
||||||
|
memcpy(&data[datapos], k, skeysize);
|
||||||
|
key2native(k);
|
||||||
|
datapos += skeysize;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *p, *pt = NULL;
|
||||||
|
HASH_ITER(hh, pcppubkey_hash, p, pt) {
|
||||||
|
pubkey2be(p);
|
||||||
|
memcpy(&data[datapos], p, pkeysize);
|
||||||
|
pubkey2native(p);
|
||||||
|
datapos += pkeysize;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto_hash_sha256(checksum, data, datasize);
|
||||||
|
|
||||||
|
bzero(data, datasize);
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcpvault_copy(vault_t *tmp, vault_t *vault) {
|
||||||
|
// fetch tmp content
|
||||||
|
fseek(tmp->fd, 0, SEEK_END);
|
||||||
|
int tmpsize = ftell(tmp->fd);
|
||||||
|
fseek(tmp->fd, 0, SEEK_SET);
|
||||||
|
unsigned char *in = ucmalloc(tmpsize);
|
||||||
|
fread(in, tmpsize, 1, tmp->fd);
|
||||||
|
|
||||||
|
// and put it into the old file
|
||||||
|
vault->fd = freopen(vault->filename, "wb+", vault->fd);
|
||||||
|
fwrite(in, tmpsize, 1, vault->fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpvault_unlink(vault_t *tmp) {
|
||||||
|
int i, tmpsize;
|
||||||
|
unsigned char *r;
|
||||||
|
fseek(tmp->fd, 0, SEEK_END);
|
||||||
|
tmpsize = ftell(tmp->fd);
|
||||||
|
r = ucmalloc(tmpsize);
|
||||||
|
for (i=0; i<16; ++i) {
|
||||||
|
fseek(tmp->fd, 0, SEEK_SET);
|
||||||
|
arc4random_buf(r, tmpsize);
|
||||||
|
fwrite(r, tmpsize, 1, tmp->fd);
|
||||||
|
}
|
||||||
|
fclose(tmp->fd);
|
||||||
|
unlink(tmp->filename);
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcpvault_close(vault_t *vault) {
|
||||||
|
if(vault != NULL) {
|
||||||
|
if(vault->fd) {
|
||||||
|
if(vault->unsafed == 1) {
|
||||||
|
pcpvault_writeall(vault);
|
||||||
|
}
|
||||||
|
fclose(vault->fd);
|
||||||
|
}
|
||||||
|
free(vault);
|
||||||
|
vault = NULL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault_header_t * vh2be(vault_header_t *h) {
|
||||||
|
h->version = htobe32(h->version);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault_header_t * vh2native(vault_header_t *h) {
|
||||||
|
h->version = be32toh(h->version);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault_item_header_t * ih2be(vault_item_header_t *h) {
|
||||||
|
h->version = htobe32(h->version);
|
||||||
|
h->size = htobe32(h->size);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
vault_item_header_t * ih2native(vault_item_header_t *h) {
|
||||||
|
h->version = be32toh(h->version);
|
||||||
|
h->size = be32toh(h->size);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pcpvault_fetchall(vault_t *vault) {
|
||||||
|
fseek(vault->fd, 0, SEEK_SET);
|
||||||
|
|
||||||
|
vault_header_t *header = ucmalloc(sizeof(vault_header_t));
|
||||||
|
vault_item_header_t *item = ucmalloc(sizeof(vault_item_header_t));
|
||||||
|
fread(header, sizeof(vault_header_t), 1, vault->fd);
|
||||||
|
vh2native(header);
|
||||||
|
|
||||||
|
if(header->fileid == PCP_VAULT_ID && header->version == PCP_VAULT_VERSION) {
|
||||||
|
// loop over the file and slurp everything in
|
||||||
|
pcpkey_hash = NULL;
|
||||||
|
pcppubkey_hash = NULL;
|
||||||
|
int readpos = 0;
|
||||||
|
pcp_key_t *key;
|
||||||
|
pcp_pubkey_t *pubkey;
|
||||||
|
int bytesleft = 0;
|
||||||
|
int ksize = sizeof(pcp_pubkey_t); // smallest possbile item
|
||||||
|
|
||||||
|
vault->version = header->version;
|
||||||
|
memcpy(vault->checksum, header->checksum, 32);
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
readpos = ftell(vault->fd);
|
||||||
|
if(vault->size - readpos >= sizeof(vault_item_header_t)) {
|
||||||
|
// an item header follows
|
||||||
|
fread(item, sizeof(vault_item_header_t), 1, vault->fd);
|
||||||
|
ih2native(item);
|
||||||
|
|
||||||
|
if(item->size > 0) {
|
||||||
|
// item is valid
|
||||||
|
readpos = ftell(vault->fd);
|
||||||
|
bytesleft = vault->size - readpos;
|
||||||
|
if(bytesleft >= ksize) {
|
||||||
|
// a key follows
|
||||||
|
if(item->type == PCP_KEY_TYPE_MAINSECRET ||
|
||||||
|
item->type == PCP_KEY_TYPE_SECRET) {
|
||||||
|
// read a secret key
|
||||||
|
key = ucmalloc(sizeof(pcp_key_t));
|
||||||
|
fread(key, sizeof(pcp_key_t), 1, vault->fd);
|
||||||
|
key2native(key);
|
||||||
|
//pcp_dumpkey(key);
|
||||||
|
HASH_ADD_STR( pcpkey_hash, id, key );
|
||||||
|
}
|
||||||
|
else if(item->type == PCP_KEY_TYPE_PUBLIC) {
|
||||||
|
// read a public key
|
||||||
|
pubkey = ucmalloc(sizeof(pcp_pubkey_t));
|
||||||
|
fread(pubkey, sizeof(pcp_pubkey_t), 1, vault->fd);
|
||||||
|
pubkey2native(pubkey);
|
||||||
|
HASH_ADD_STR( pcppubkey_hash, id, pubkey );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("Failed to read vault - invalid key type: %02X! at %d\n", item->type, readpos);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("Failed to read vault - that's no pcp key at %d!\n", readpos);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("Failed to read vault - invalid key item header size at %d!\n",
|
||||||
|
readpos);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// no more items
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("Unexpected vault file format!\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *checksum = NULL;
|
||||||
|
checksum = pcpvault_create_checksum(vault);
|
||||||
|
if(HASH_COUNT(pcpkey_hash) + HASH_COUNT(pcppubkey_hash) > 0) {
|
||||||
|
// only validate the checksum if there are keys
|
||||||
|
if(memcmp(checksum, vault->checksum, 32) != 0) {
|
||||||
|
fatal("Error: the checksum of the key vault doesn't match its contents!\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(checksum);
|
||||||
|
free(item);
|
||||||
|
free(header);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
free(item);
|
||||||
|
free(header);
|
||||||
|
pcp_cleanhashes();
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
62
libpcp/vault.h
Normal file
62
libpcp/vault.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
#ifndef _HAVE_PCP_VAULT
|
||||||
|
#define _HAVE_PCP_VAULT
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "mem.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "uthash.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct _vault_t {
|
||||||
|
char *filename;
|
||||||
|
FILE *fd;
|
||||||
|
uint8_t unsafed;
|
||||||
|
uint8_t isnew;
|
||||||
|
uint32_t size;
|
||||||
|
time_t modified;
|
||||||
|
mode_t mode;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _vault_header_t {
|
||||||
|
byte fileid;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _vault_item_header_t {
|
||||||
|
byte type;
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t version;
|
||||||
|
byte checksum[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _vault_t vault_t;
|
||||||
|
typedef struct _vault_header_t vault_header_t;
|
||||||
|
typedef struct _vault_item_header_t vault_item_header_t;
|
||||||
|
|
||||||
|
vault_t *pcpvault_init(char *filename);
|
||||||
|
vault_t *pcpvault_new(char *filename, int is_tmp);
|
||||||
|
int pcpvault_create(vault_t *vault);
|
||||||
|
int pcpvault_additem(vault_t *vault, void *item, size_t itemsize, uint8_t type, uint8_t do_hash);
|
||||||
|
int pcpvault_close(vault_t *vault);
|
||||||
|
int pcpvault_fetchall(vault_t *vault);
|
||||||
|
int pcpvault_writeall(vault_t *vault);
|
||||||
|
void pcpvault_copy(vault_t *tmp, vault_t *vault);
|
||||||
|
void pcpvault_unlink(vault_t *tmp);
|
||||||
|
unsigned char *pcpvault_create_checksum(vault_t *vault);
|
||||||
|
void pcpvault_update_checksum(vault_t *vault);
|
||||||
|
|
||||||
|
vault_header_t * vh2be(vault_header_t *h);
|
||||||
|
vault_header_t * vh2native(vault_header_t *h);
|
||||||
|
vault_item_header_t * ih2be(vault_item_header_t *h);
|
||||||
|
vault_item_header_t * ih2native(vault_item_header_t *h);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_VAULT
|
||||||
5
libpcp/version.c
Normal file
5
libpcp/version.c
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
int pcp_version() {
|
||||||
|
return PCP_VERSION;
|
||||||
|
}
|
||||||
15
libpcp/version.h
Normal file
15
libpcp/version.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef _HAVE_PCP_VERSION
|
||||||
|
#define _HAVE_PCP_VERSION
|
||||||
|
|
||||||
|
#define PCP_VERSION_MAJOR 0
|
||||||
|
#define PCP_VERSION_MINOR 0
|
||||||
|
#define PCP_VERSION_PATCH 1
|
||||||
|
|
||||||
|
#define PCP_MAKE_VERSION(major, minor, patch) \
|
||||||
|
((major) * 10000 + (minor) * 100 + (patch))
|
||||||
|
#define PCP_VERSION \
|
||||||
|
PCP_MAKE_VERSION(PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH)
|
||||||
|
|
||||||
|
int pcp_version();
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_VERSION
|
||||||
75
libpcp/warn.c
Normal file
75
libpcp/warn.c
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2009 Colin Percival
|
||||||
|
* 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file was originally written by Colin Percival as part of the Tarsnap
|
||||||
|
* online backup system.
|
||||||
|
*/
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_ERR_H
|
||||||
|
/*
|
||||||
|
* Everything is provided through err.h and the associated library, so we
|
||||||
|
* don't need to do anything here.
|
||||||
|
*/
|
||||||
|
#else
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "warn.h"
|
||||||
|
|
||||||
|
const char * warn_progname = "(null)";
|
||||||
|
|
||||||
|
void
|
||||||
|
warn(const char * fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s", warn_progname);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
fprintf(stderr, ": ");
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
}
|
||||||
|
fprintf(stderr, ": %s\n", strerror(errno));
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warnx(const char * fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s", warn_progname);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
fprintf(stderr, ": ");
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
13
libpcp/warn.h
Normal file
13
libpcp/warn.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef _HAVE_PCP_WARN_H
|
||||||
|
#define _HAVE_PCP_WARN_H
|
||||||
|
|
||||||
|
#ifdef HAVE_ERR_H
|
||||||
|
#include <err.h>
|
||||||
|
#else
|
||||||
|
#define NEED_WARN_PROGNAME
|
||||||
|
const char * warn_progname;
|
||||||
|
void warn(const char *, ...);
|
||||||
|
void warnx(const char *, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_HAVE_WARN_H */
|
||||||
178
libpcp/z85.c
Normal file
178
libpcp/z85.c
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
#include "z85.h"
|
||||||
|
|
||||||
|
unsigned char *pcp_padfour(unsigned char *src, size_t srclen, size_t *dstlen) {
|
||||||
|
size_t outlen, zerolen;
|
||||||
|
unsigned char *dst;
|
||||||
|
|
||||||
|
outlen = srclen + 1; // 1 for the pad flag
|
||||||
|
while (outlen % 4 != 0) outlen++;
|
||||||
|
zerolen = outlen - (srclen + 1);
|
||||||
|
|
||||||
|
dst = (unsigned char*)ucmalloc(outlen);
|
||||||
|
dst[0] = zerolen; // add the number of zeros we add
|
||||||
|
memcpy(&dst[1], src, srclen); // add the original
|
||||||
|
bzero(&dst[srclen+1], zerolen); // pad with zeroes
|
||||||
|
|
||||||
|
*dstlen = outlen;
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen) {
|
||||||
|
size_t outlen;
|
||||||
|
size_t numzeroes;
|
||||||
|
unsigned char *dst;
|
||||||
|
|
||||||
|
numzeroes = src[0]; // first byte tells us how many zeroes we've got
|
||||||
|
outlen = srclen - 1 - numzeroes;
|
||||||
|
|
||||||
|
dst = malloc(outlen);
|
||||||
|
|
||||||
|
memcpy(dst, &src[1], outlen);
|
||||||
|
|
||||||
|
*dstlen = outlen;
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *pcp_z85_decode(char *z85block, size_t *dstlen) {
|
||||||
|
unsigned char *bin;
|
||||||
|
int i, pos;
|
||||||
|
size_t zlen, binlen, outlen;
|
||||||
|
|
||||||
|
zlen = strlen(z85block);
|
||||||
|
char *z85 = ucmalloc(zlen);
|
||||||
|
|
||||||
|
// remove newlines
|
||||||
|
pos = 0;
|
||||||
|
for(i=0; i<zlen+1; ++i) {
|
||||||
|
if(z85block[i] != '\r' && z85block[i] != '\n') {
|
||||||
|
z85[pos] = z85block[i];
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
binlen = strlen (z85) * 4 / 5;
|
||||||
|
bin = ucmalloc(binlen);
|
||||||
|
bin = zmq_z85_decode(bin, z85);
|
||||||
|
|
||||||
|
unsigned char *raw = NULL;
|
||||||
|
if(bin != NULL) {
|
||||||
|
raw = pcp_unpadfour(bin, binlen, &outlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(z85);
|
||||||
|
free(bin);
|
||||||
|
|
||||||
|
*dstlen = outlen;
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pcp_z85_encode(unsigned char *raw, size_t srclen, size_t *dstlen) {
|
||||||
|
int i, pos, b;
|
||||||
|
size_t outlen, blocklen, zlen;
|
||||||
|
|
||||||
|
// make z85 happy (size % 4)
|
||||||
|
unsigned char *padded = pcp_padfour(raw, srclen, &outlen);
|
||||||
|
|
||||||
|
// encode to z85
|
||||||
|
zlen = (outlen * 5 / 4) + 1;
|
||||||
|
char *z85 = ucmalloc(zlen);
|
||||||
|
z85 = zmq_z85_encode(z85, padded, outlen);
|
||||||
|
|
||||||
|
// make it a 72 chars wide block
|
||||||
|
blocklen = strlen(z85) + ((strlen(z85) / 72) * 2) + 1;
|
||||||
|
char *z85block = ucmalloc(blocklen);
|
||||||
|
|
||||||
|
pos = b = 0;
|
||||||
|
for(i=0; i<zlen; ++i) {
|
||||||
|
if(pos >= 71) {
|
||||||
|
z85block[b++] = '\r';
|
||||||
|
z85block[b++] = '\n';
|
||||||
|
pos = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
z85block[b++] = z85[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
*dstlen = blocklen;
|
||||||
|
free(z85);
|
||||||
|
free(padded);
|
||||||
|
|
||||||
|
return z85block;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *pcp_readz85file(FILE *infile) {
|
||||||
|
unsigned char *input = NULL;
|
||||||
|
unsigned char *out = NULL;
|
||||||
|
unsigned char *tmp = NULL;
|
||||||
|
char *ret;
|
||||||
|
char *line;
|
||||||
|
unsigned char byte[1];
|
||||||
|
int i, outsize, lpos, x;
|
||||||
|
size_t bufsize = 0;
|
||||||
|
lpos = outsize = 0;
|
||||||
|
size_t MAXLINE = 1024;
|
||||||
|
|
||||||
|
while(!feof(infile)) {
|
||||||
|
if(!fread(&byte, 1, 1, infile))
|
||||||
|
break;
|
||||||
|
tmp = realloc(input, bufsize + 1);
|
||||||
|
input = tmp;
|
||||||
|
memmove(&input[bufsize], byte, 1);
|
||||||
|
bufsize ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bufsize == 0) {
|
||||||
|
fatal("Input file is empty!\n");
|
||||||
|
goto rferrx;
|
||||||
|
}
|
||||||
|
|
||||||
|
out = ucmalloc(bufsize);
|
||||||
|
line = ucmalloc(MAXLINE);
|
||||||
|
|
||||||
|
for(i=0; i<bufsize; ++i) {
|
||||||
|
if(lpos > MAXLINE) {
|
||||||
|
// huh, now that's suspicious
|
||||||
|
fatal("Invalid input, line is too long (%d bytes so far)!\n", lpos);
|
||||||
|
goto rferr;
|
||||||
|
}
|
||||||
|
if(input[i] != '\n' && input[i] != '\r') {
|
||||||
|
line[lpos++] = input[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(line[0] != ' ' && strncmp(line, "-----", 5) != 0) {
|
||||||
|
if(lpos > 0) {
|
||||||
|
for(x=0;x<lpos;++x)
|
||||||
|
out[outsize+x] = line[x];
|
||||||
|
outsize += lpos;
|
||||||
|
lpos = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lpos = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out[outsize+1] = '\0';
|
||||||
|
|
||||||
|
ret = ucmalloc(outsize+1);
|
||||||
|
memcpy(ret, out, outsize+1);
|
||||||
|
|
||||||
|
free(tmp);
|
||||||
|
free(out);
|
||||||
|
free(line);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rferr:
|
||||||
|
free(out);
|
||||||
|
free(line);
|
||||||
|
rferrx:
|
||||||
|
free(tmp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
23
libpcp/z85.h
Normal file
23
libpcp/z85.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// from https://github.com/tlinden/curve-keygen/
|
||||||
|
#ifndef _HAVE_PCP_Z85_H
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "zmq_z85.h"
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
// convert a binary stream to one which gets accepted by zmq_z85_encode
|
||||||
|
// we pad it with zeroes and put the number of zerores in front of it
|
||||||
|
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
// the reverse of the above
|
||||||
|
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
// wrapper around zmq Z85 encoding function
|
||||||
|
unsigned char *pcp_z85_decode(char *z85block, size_t *dstlen);
|
||||||
|
|
||||||
|
// the reverse of the above
|
||||||
|
char *pcp_z85_encode(unsigned char *raw, size_t srclen, size_t *dstlen);
|
||||||
|
|
||||||
|
char *pcp_readz85file(FILE *infile);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_Z85_H
|
||||||
110
libpcp/zmq_z85.c
Normal file
110
libpcp/zmq_z85.c
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
|
||||||
|
|
||||||
|
This file is part of 0MQ.
|
||||||
|
|
||||||
|
0MQ 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
0MQ is distributed in the hope that 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "zmq_z85.h"
|
||||||
|
|
||||||
|
// Z85 codec, taken from 0MQ RFC project, implements RFC32 Z85 encoding
|
||||||
|
|
||||||
|
// Maps base 256 to base 85
|
||||||
|
static char encoder [85 + 1] = {
|
||||||
|
"0123456789" "abcdefghij" "klmnopqrst" "uvwxyzABCD"
|
||||||
|
"EFGHIJKLMN" "OPQRSTUVWX" "YZ.-:+=^!/" "*?&<>()[]{"
|
||||||
|
"}@%$#"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Maps base 85 to base 256
|
||||||
|
// We chop off lower 32 and higher 128 ranges
|
||||||
|
static uint8_t decoder [96] = {
|
||||||
|
0x00, 0x44, 0x00, 0x54, 0x53, 0x52, 0x48, 0x00,
|
||||||
|
0x4B, 0x4C, 0x46, 0x41, 0x00, 0x3F, 0x3E, 0x45,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x40, 0x00, 0x49, 0x42, 0x4A, 0x47,
|
||||||
|
0x51, 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, 0x4D, 0x00, 0x4E, 0x43, 0x00,
|
||||||
|
0x00, 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, 0x4F, 0x00, 0x50, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// Encode a binary frame as a string; destination string MUST be at least
|
||||||
|
// size * 5 / 4 bytes long plus 1 byte for the null terminator. Returns
|
||||||
|
// dest. Size must be a multiple of 4.
|
||||||
|
|
||||||
|
char *zmq_z85_encode (char *dest, uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
if (size % 4 != 0)
|
||||||
|
return NULL; // !assert
|
||||||
|
|
||||||
|
unsigned int char_nbr = 0;
|
||||||
|
unsigned int byte_nbr = 0;
|
||||||
|
uint32_t value = 0;
|
||||||
|
while (byte_nbr < size) {
|
||||||
|
// Accumulate value in base 256 (binary)
|
||||||
|
value = value * 256 + data [byte_nbr++];
|
||||||
|
if (byte_nbr % 4 == 0) {
|
||||||
|
// Output value in base 85
|
||||||
|
unsigned int divisor = 85 * 85 * 85 * 85;
|
||||||
|
while (divisor) {
|
||||||
|
dest [char_nbr++] = encoder [value / divisor % 85];
|
||||||
|
divisor /= 85;
|
||||||
|
}
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (char_nbr != size * 5 / 4)
|
||||||
|
return NULL; // !assert
|
||||||
|
|
||||||
|
dest [char_nbr] = 0;
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// Decode an encoded string into a binary frame; dest must be at least
|
||||||
|
// strlen (string) * 4 / 5 bytes long. Returns dest. strlen (string)
|
||||||
|
// must be a multiple of 5.
|
||||||
|
|
||||||
|
uint8_t *zmq_z85_decode (uint8_t *dest, char *string)
|
||||||
|
{
|
||||||
|
if (strlen (string) % 5 != 0)
|
||||||
|
return NULL; // !assert
|
||||||
|
unsigned int byte_nbr = 0;
|
||||||
|
unsigned int char_nbr = 0;
|
||||||
|
uint32_t value = 0;
|
||||||
|
while (char_nbr < strlen (string)) {
|
||||||
|
// Accumulate value in base 85
|
||||||
|
value = value * 85 + decoder [(uint8_t) string [char_nbr++] - 32];
|
||||||
|
if (char_nbr % 5 == 0) {
|
||||||
|
// Output value in base 256
|
||||||
|
unsigned int divisor = 256 * 256 * 256;
|
||||||
|
while (divisor) {
|
||||||
|
dest [byte_nbr++] = value / divisor % 256;
|
||||||
|
divisor /= 256;
|
||||||
|
}
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (byte_nbr != strlen (string) * 4 / 5)
|
||||||
|
return NULL; //!assert
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
39
libpcp/zmq_z85.h
Normal file
39
libpcp/zmq_z85.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
|
||||||
|
|
||||||
|
This file is part of 0MQ.
|
||||||
|
|
||||||
|
0MQ 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
0MQ is distributed in the hope that 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ZMQ_Z85_H_INCLUDED__
|
||||||
|
#define __ZMQ_Z85_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint8_t *zmq_z85_decode (uint8_t *dest, char *string);
|
||||||
|
char *zmq_z85_encode (char *dest, uint8_t *data, size_t size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
3
man/Makefile.am
Normal file
3
man/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
man_MANS = pcp1.1
|
||||||
|
dist_man_MANS = $(man_MANS)
|
||||||
|
DATAROOTDIR = /usr
|
||||||
478
man/Makefile.in
Normal file
478
man/Makefile.in
Normal file
@@ -0,0 +1,478 @@
|
|||||||
|
# Makefile.in generated by automake 1.12.4 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2012 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__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
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 = man
|
||||||
|
DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
|
||||||
|
$(top_srcdir)/config/ltoptions.m4 \
|
||||||
|
$(top_srcdir)/config/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/config/ltversion.m4 \
|
||||||
|
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/libpcp/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
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; }; \
|
||||||
|
}
|
||||||
|
man1dir = $(mandir)/man1
|
||||||
|
am__installdirs = "$(DESTDIR)$(man1dir)"
|
||||||
|
NROFF = nroff
|
||||||
|
MANS = $(dist_man_MANS) $(man_MANS)
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
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@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
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@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
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@
|
||||||
|
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@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
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@
|
||||||
|
man_MANS = pcp1.1
|
||||||
|
dist_man_MANS = $(man_MANS)
|
||||||
|
DATAROOTDIR = /usr
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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) --gnu man/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu man/Makefile
|
||||||
|
.PRECIOUS: 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_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(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-man1: $(dist_man_MANS) $(man_MANS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list1=''; \
|
||||||
|
list2='$(dist_man_MANS) $(man_MANS)'; \
|
||||||
|
test -n "$(man1dir)" \
|
||||||
|
&& test -n "`echo $$list1$$list2`" \
|
||||||
|
|| exit 0; \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
|
||||||
|
{ for i in $$list1; do echo "$$i"; done; \
|
||||||
|
if test -n "$$list2"; then \
|
||||||
|
for i in $$list2; do echo "$$i"; done \
|
||||||
|
| sed -n '/\.1[a-z]*$$/p'; \
|
||||||
|
fi; \
|
||||||
|
} | while read p; do \
|
||||||
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; echo "$$p"; \
|
||||||
|
done | \
|
||||||
|
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||||
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
||||||
|
sed 'N;N;s,\n, ,g' | { \
|
||||||
|
list=; while read file base inst; do \
|
||||||
|
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
||||||
|
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
|
||||||
|
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
test -z "$$files" || { \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
|
||||||
|
done; }
|
||||||
|
|
||||||
|
uninstall-man1:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list=''; test -n "$(man1dir)" || exit 0; \
|
||||||
|
files=`{ for i in $$list; do echo "$$i"; done; \
|
||||||
|
l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
||||||
|
sed -n '/\.1[a-z]*$$/p'; \
|
||||||
|
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||||
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||||
|
dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS:
|
||||||
|
|
||||||
|
cscope cscopelist:
|
||||||
|
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@list='$(MANS)'; if test -n "$$list"; then \
|
||||||
|
list=`for p in $$list; do \
|
||||||
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
|
||||||
|
if test -n "$$list" && \
|
||||||
|
grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
|
||||||
|
echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \
|
||||||
|
grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
|
||||||
|
echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
|
||||||
|
echo " typically 'make maintainer-clean' will remove them" >&2; \
|
||||||
|
exit 1; \
|
||||||
|
else :; fi; \
|
||||||
|
else :; fi
|
||||||
|
@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 $(MANS)
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(man1dir)"; 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-man
|
||||||
|
|
||||||
|
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-man1
|
||||||
|
|
||||||
|
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-man
|
||||||
|
|
||||||
|
uninstall-man: uninstall-man1
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||||
|
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-info install-info-am install-man install-man1 \
|
||||||
|
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 \
|
||||||
|
uninstall uninstall-am uninstall-man uninstall-man1
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
106
man/details.pod
Normal file
106
man/details.pod
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
|
||||||
|
=head1 PCP1 KEYS
|
||||||
|
|
||||||
|
B<pcp1> keys are stored in a binary file, called B<the vault>.
|
||||||
|
It's by default located in B<~/.pcpvault> but you can of course
|
||||||
|
specify another location using the B<-V> option.
|
||||||
|
|
||||||
|
There are two kinds of keys: secret and public keys. In reality
|
||||||
|
a secret key always includes its public key. Both types of keys
|
||||||
|
can be exported to files and transfered to other people who can
|
||||||
|
then import them. You should usually only do this with public keys
|
||||||
|
though.
|
||||||
|
|
||||||
|
There is a primary secret key which will always used for operations
|
||||||
|
when no keyid has been specified. However, you may have as many
|
||||||
|
secret keys in your vault as you like.
|
||||||
|
|
||||||
|
Each key can be identified using its B<keyid> which looks like this:
|
||||||
|
|
||||||
|
0xD49119E85266509F
|
||||||
|
|
||||||
|
A public key exported from a secret key will have the same keyid
|
||||||
|
as the secret key. When using for encryption, the keyid will be
|
||||||
|
added to the message so that the receiver knows who was the
|
||||||
|
sender of the message (B<This might change in the future. As of
|
||||||
|
this writing I'm not sure if this was a good idea>).
|
||||||
|
|
||||||
|
If you just want to know details about a key or the vault, use the
|
||||||
|
B<-t> option.
|
||||||
|
|
||||||
|
=head1 INTERNALS
|
||||||
|
|
||||||
|
FIXME.
|
||||||
|
|
||||||
|
=head1 Z85 ENCODING
|
||||||
|
|
||||||
|
B<pcp1> uses Z85 to encode exported keys and encrypted messages.
|
||||||
|
Therefore it includes a Z85 utility mode:
|
||||||
|
|
||||||
|
B<pcp1> can be used to encode and decode strings to Z85 encoding.
|
||||||
|
|
||||||
|
The option B<-z> encodes B<to> Z85, the option B<-Z> does the opposite
|
||||||
|
and decodes B<from> Z85.
|
||||||
|
|
||||||
|
If no input file have been specified using B<-I>, B<pcp1> expects the
|
||||||
|
input to come from B<STDIN>, otherwise it reads the contents
|
||||||
|
of B<file>.
|
||||||
|
|
||||||
|
Encoded or decoded output will be written to B<STDOUT> unless an
|
||||||
|
output file has been specified using the option B<-O>.
|
||||||
|
|
||||||
|
=head2 EXAMPLES
|
||||||
|
|
||||||
|
To encode a given file to Z85 and write the output to another:
|
||||||
|
|
||||||
|
pcp1 -z myfile.bin > myfile.z85
|
||||||
|
|
||||||
|
To decode the file created above and restore the original:
|
||||||
|
|
||||||
|
pcp1 -Z -d myfile.z85 > myfile.bin
|
||||||
|
|
||||||
|
To encode something from stdin to Z85:
|
||||||
|
|
||||||
|
ps axuw | pcp1 -z > pslist.z85
|
||||||
|
|
||||||
|
To decode the above and print to stdout:
|
||||||
|
|
||||||
|
pcp1 -Z -d pslist.z85
|
||||||
|
|
||||||
|
=head2 BACKGROUND
|
||||||
|
|
||||||
|
The Z85 encoding format is described here: B<http://rfc.zeromq.org/spec:32>.
|
||||||
|
It's part of ZeroMQ (B<http://zeromq.org>). Z85 is based on ASCII85 with
|
||||||
|
a couple of modifications (portability, readability etc).
|
||||||
|
|
||||||
|
To fulfil the requirements of the ZeroMQ Z85 functions, B<pcp1>
|
||||||
|
does some additional preparations of raw input before actually doing the
|
||||||
|
encoding, since the input for zmq_z85_encode() must be divisible by 4:
|
||||||
|
|
||||||
|
Expand the input so that the resulting size is divisible by 4.
|
||||||
|
|
||||||
|
Fill the added bytes with zeroes.
|
||||||
|
|
||||||
|
Prepend the input with a one byte value which holds the number of zeroes
|
||||||
|
added in the previous step.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Raw input:
|
||||||
|
|
||||||
|
hello\0
|
||||||
|
|
||||||
|
Here, the input size is 6, which is insufficient, therefore it has to be expanded
|
||||||
|
to be 8. After the process the input looks like this:
|
||||||
|
|
||||||
|
1hello\0\0
|
||||||
|
|
||||||
|
So, we padded the input with 1 zero (makes 7 bytes) and preprended it with the
|
||||||
|
value 1 (the number of zeros added): makes 8 bytes total.
|
||||||
|
|
||||||
|
After decoding Z85 input the process will be reversed.
|
||||||
|
|
||||||
|
B<Trying to use another tool to decode an Z85 encoded string produced
|
||||||
|
by z85, might not work therefore, unless the tool takes the padding scheme
|
||||||
|
outlined above into account>.
|
||||||
|
|
||||||
55
man/footer.pod
Normal file
55
man/footer.pod
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2013 by T.Linden <tom AT cpan DOT org>
|
||||||
|
|
||||||
|
=head1 ADDITIONAL COPYRIGHTS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<ZeroMQ Z85 encoding routine>
|
||||||
|
|
||||||
|
Copyright (c) 2007-2013 iMatix Corporation
|
||||||
|
Copyright (c) 2009-2011 250bpm s.r.o.
|
||||||
|
Copyright (c) 2010-2011 Miru Limited
|
||||||
|
Copyright (c) 2011 VMware, Inc.
|
||||||
|
Copyright (c) 2012 Spotify AB
|
||||||
|
|
||||||
|
=item B<Tarsnap readpass helpers>
|
||||||
|
|
||||||
|
Copyright 2009 Colin Percival
|
||||||
|
|
||||||
|
=item B<jen_hash() hash algorithm>
|
||||||
|
|
||||||
|
Bob Jenkins, Public Domain.
|
||||||
|
|
||||||
|
=item B<UTHASH hashing macros>
|
||||||
|
|
||||||
|
Copyright (c) 2003-2013, Troy D. Hanson
|
||||||
|
|
||||||
|
=item B<Random art image from OpenSSH keygen>
|
||||||
|
|
||||||
|
Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
|
||||||
|
Comitted by Alexander von Gernler in rev 1.7.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Every incorporated source code is opensource and licensed
|
||||||
|
under the B<GPL> as well.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
I<T.Linden <tom AT cpan DOT org>>
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
=head1 HOME
|
||||||
|
|
||||||
|
The homepage of Pretty Curved Privacy can be found on
|
||||||
|
http://www.daemon.de/PrettyCurvedPrivacy. The source is
|
||||||
|
on Github: https://github.com/TLINDEN/pcp
|
||||||
|
|
||||||
|
=cut
|
||||||
33
man/install.pod
Normal file
33
man/install.pod
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
=head1 INSTALLATION
|
||||||
|
|
||||||
|
There are currently no packages available, so B<pcp> has to be
|
||||||
|
compiled from source. Follow these steps:
|
||||||
|
|
||||||
|
First, you will need libsodium:
|
||||||
|
|
||||||
|
git clone git://github.com/jedisct1/libsodium.git
|
||||||
|
cd libsodium
|
||||||
|
./autogen.sh
|
||||||
|
./configure && make check
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Next, pcp:
|
||||||
|
|
||||||
|
git clone git://github.com/tlinden/pcp.git
|
||||||
|
cd pcp
|
||||||
|
./configure
|
||||||
|
sudo make install
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
Optionally, you might run the unit tests:
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
=head1 DOCUMENTATION
|
||||||
|
|
||||||
|
To learn how to use B<pcp>, read the manpage:
|
||||||
|
|
||||||
|
man pcp1
|
||||||
|
|
||||||
68
man/pcp.pod
Normal file
68
man/pcp.pod
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<Pretty Curved Privacy> (pcp1) is a commandline utility which can
|
||||||
|
be used to encrypt files. B<pcp1> uses eliptc curve cryptography
|
||||||
|
for encryption (CURVE25519 by Dan J. Bernstein). While CURVE25519
|
||||||
|
is no worldwide accepted standard it hasn't been compromised by
|
||||||
|
the NSA - which might be better, depending on your point of view.
|
||||||
|
|
||||||
|
B<Caution>: since CURVE25519 is no accepted standard, B<pcp1> has
|
||||||
|
to be considered as experimental software. In fact, I wrote it just
|
||||||
|
to learn about the curve and see how it works.
|
||||||
|
|
||||||
|
Beside some differences it works like B<GNUPG>. So, if you already
|
||||||
|
know how to use gpg, you'll feel almost home.
|
||||||
|
|
||||||
|
=head1 QUICKSTART
|
||||||
|
|
||||||
|
Lets say, Alicia and Bobby want to exchange encrypted messages.
|
||||||
|
Here's what the've got to do.
|
||||||
|
|
||||||
|
First, both have create a secret key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -k pcp1 -k
|
||||||
|
|
||||||
|
After entering their name, email address and a passphrase to protect
|
||||||
|
the key, it will be stored in their B<vault file> (by default ~/.pcpvault).
|
||||||
|
|
||||||
|
Now, both of them have to export the public key part of their key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -p -O alicia.pub pcp1 -p -O bobby.pub
|
||||||
|
|
||||||
|
They've to exchange the public key somehow (which is not my
|
||||||
|
problem at the moment, use ssh, encrypted mail, whatever). Once exchanged,
|
||||||
|
they have to import it:
|
||||||
|
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -P -I bobby.pub pcp1 -P -I alicia.pub
|
||||||
|
|
||||||
|
They will see a response as this when done:
|
||||||
|
|
||||||
|
key 0x29A323A2C295D391 added to .pcpvault.
|
||||||
|
|
||||||
|
Now, Alicia finally writes the secret message, encrypts it and
|
||||||
|
sends it to Bobby, who in turn decrypts it:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
echo "Love you, honey" > letter
|
||||||
|
pcp1 -e -i 0x29A323A2C295D391 -I letter -O letter.z85
|
||||||
|
cat letter.z85 | mail bobby@foo.bar
|
||||||
|
|
||||||
|
pcp1 -d -I letter.z85 | less
|
||||||
|
|
||||||
|
And that's it.
|
||||||
|
|
||||||
|
Please note the big difference to B<GPG> though: both Alicia
|
||||||
|
AND Bobby have to enter the passphrase for their secret key!
|
||||||
|
That's the way CURVE25519 works: you encrypt a message using
|
||||||
|
your secret key and the recipients public key and the recipient
|
||||||
|
does the opposite, he uses his secret key and your public key
|
||||||
|
to actually decrypt the message.
|
||||||
|
|
||||||
|
Oh - and if you're wondering why I named them Alicia and Bobby:
|
||||||
|
I was just sick of Alice and Bob. We're running NSA-free, so we're
|
||||||
|
using other sample names as well.
|
||||||
|
|
||||||
443
man/pcp1.1
Normal file
443
man/pcp1.1
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
|
||||||
|
.\"
|
||||||
|
.\" Standard preamble:
|
||||||
|
.\" ========================================================================
|
||||||
|
.de Sp \" Vertical space (when we can't use .PP)
|
||||||
|
.if t .sp .5v
|
||||||
|
.if n .sp
|
||||||
|
..
|
||||||
|
.de Vb \" Begin verbatim text
|
||||||
|
.ft CW
|
||||||
|
.nf
|
||||||
|
.ne \\$1
|
||||||
|
..
|
||||||
|
.de Ve \" End verbatim text
|
||||||
|
.ft R
|
||||||
|
.fi
|
||||||
|
..
|
||||||
|
.\" Set up some character translations and predefined strings. \*(-- will
|
||||||
|
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
||||||
|
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
||||||
|
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
||||||
|
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
||||||
|
.\" nothing in troff, for use with C<>.
|
||||||
|
.tr \(*W-
|
||||||
|
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||||
|
.ie n \{\
|
||||||
|
. ds -- \(*W-
|
||||||
|
. ds PI pi
|
||||||
|
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||||
|
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||||
|
. ds L" ""
|
||||||
|
. ds R" ""
|
||||||
|
. ds C` ""
|
||||||
|
. ds C' ""
|
||||||
|
'br\}
|
||||||
|
.el\{\
|
||||||
|
. ds -- \|\(em\|
|
||||||
|
. ds PI \(*p
|
||||||
|
. ds L" ``
|
||||||
|
. ds R" ''
|
||||||
|
'br\}
|
||||||
|
.\"
|
||||||
|
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||||
|
.ie \n(.g .ds Aq \(aq
|
||||||
|
.el .ds Aq '
|
||||||
|
.\"
|
||||||
|
.\" If the F register is turned on, we'll generate index entries on stderr for
|
||||||
|
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||||
|
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||||
|
.\" output yourself in some meaningful fashion.
|
||||||
|
.ie \nF \{\
|
||||||
|
. de IX
|
||||||
|
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||||
|
..
|
||||||
|
. nr % 0
|
||||||
|
. rr F
|
||||||
|
.\}
|
||||||
|
.el \{\
|
||||||
|
. de IX
|
||||||
|
..
|
||||||
|
.\}
|
||||||
|
.\"
|
||||||
|
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||||
|
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||||
|
. \" fudge factors for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds #H 0
|
||||||
|
. ds #V .8m
|
||||||
|
. ds #F .3m
|
||||||
|
. ds #[ \f1
|
||||||
|
. ds #] \fP
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||||
|
. ds #V .6m
|
||||||
|
. ds #F 0
|
||||||
|
. ds #[ \&
|
||||||
|
. ds #] \&
|
||||||
|
.\}
|
||||||
|
. \" simple accents for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds ' \&
|
||||||
|
. ds ` \&
|
||||||
|
. ds ^ \&
|
||||||
|
. ds , \&
|
||||||
|
. ds ~ ~
|
||||||
|
. ds /
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||||
|
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||||
|
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||||
|
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||||
|
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||||
|
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||||
|
.\}
|
||||||
|
. \" troff and (daisy-wheel) nroff accents
|
||||||
|
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||||
|
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||||
|
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||||
|
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||||
|
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||||
|
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||||
|
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||||
|
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||||
|
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||||
|
. \" corrections for vroff
|
||||||
|
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||||
|
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||||
|
. \" for low resolution devices (crt and lpr)
|
||||||
|
.if \n(.H>23 .if \n(.V>19 \
|
||||||
|
\{\
|
||||||
|
. ds : e
|
||||||
|
. ds 8 ss
|
||||||
|
. ds o a
|
||||||
|
. ds d- d\h'-1'\(ga
|
||||||
|
. ds D- D\h'-1'\(hy
|
||||||
|
. ds th \o'bp'
|
||||||
|
. ds Th \o'LP'
|
||||||
|
. ds ae ae
|
||||||
|
. ds Ae AE
|
||||||
|
.\}
|
||||||
|
.rm #[ #] #H #V #F C
|
||||||
|
.\" ========================================================================
|
||||||
|
.\"
|
||||||
|
.IX Title "PCP1 1"
|
||||||
|
.TH PCP1 1 "2013-10-28" "PCP 0.0.1" "USER CONTRIBUTED DOCUMENTATION"
|
||||||
|
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||||
|
.\" way too many mistakes in technical documents.
|
||||||
|
.if n .ad l
|
||||||
|
.nh
|
||||||
|
.SH "NAME"
|
||||||
|
Pretty Curved Privacy \- File encryption using eliptic curve cryptography.
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
.IX Header "SYNOPSIS"
|
||||||
|
.Vb 1
|
||||||
|
\& Usage: pcp1 [options]
|
||||||
|
\&
|
||||||
|
\& General Options:
|
||||||
|
\& \-V \-\-vault <vaultfile> Specify an alternate vault file.
|
||||||
|
\& The deault vault is ~/.pcpvault.
|
||||||
|
\& \-O \-\-outfile <file> Output file. If not specified, stdout
|
||||||
|
\& will be used.
|
||||||
|
\& \-I \-\-infile <file> Input file. If not specified, stdin
|
||||||
|
\& will be used.
|
||||||
|
\& \-i \-\-keyid <id> Specify a key id to import/export.
|
||||||
|
\& \-t \-\-text Print textual representation of some
|
||||||
|
\& item. Either \-V or \-i must be specified
|
||||||
|
\& as well.
|
||||||
|
\& \-h \-\-help Print this help message.
|
||||||
|
\& \-v \-\-version Print program version.
|
||||||
|
\& \-D \-\-debug Enable debug output.
|
||||||
|
\&
|
||||||
|
\& Keymanagement Options:
|
||||||
|
\& \-k \-\-keygen Generate a CURVE25519 secret key. If
|
||||||
|
\& the generated key is the first one in
|
||||||
|
\& your vault, it will become the primary
|
||||||
|
\& secret key.
|
||||||
|
\& \-l \-\-listkeys List all keys currently stored in your
|
||||||
|
\& vault. Only the key id\*(Aqs and some info
|
||||||
|
\& about the keys will be printed, not the
|
||||||
|
\& actual keys.
|
||||||
|
\& \-r \-\-remove\-key Remove a key from the vault. Requires
|
||||||
|
\& option \-i <keyid>.
|
||||||
|
\& \-s \-\-export\-secret Export a secret key. If your vault only
|
||||||
|
\& contains one secret key, this one will
|
||||||
|
\& be exported. If a key id have been
|
||||||
|
\& specified (\-i), this one will be used.
|
||||||
|
\& If there are more than one secret keys
|
||||||
|
\& in the vault and no key id has been
|
||||||
|
\& given, export the primary secret key.
|
||||||
|
\& Use \-O to export to a file.
|
||||||
|
\& \-p \-\-export\-public Export a public key. If no key id have
|
||||||
|
\& been specified, the public part of your
|
||||||
|
\& primary secret key will be exported.
|
||||||
|
\& Use \-O to export to a file.
|
||||||
|
\& \-S \-\-import\-secret Import a secret key. Use \-I to import
|
||||||
|
\& from a file.
|
||||||
|
\& \-P \-\-import\-public Import a public key. Use \-I to import
|
||||||
|
\& from a file.
|
||||||
|
\&
|
||||||
|
\& Encryption Options:
|
||||||
|
\& \-e \-\-encrypt Encrypt a message. Read from stdin or
|
||||||
|
\& specified via \-I. A keyid (\-i) of the
|
||||||
|
\& public key of the receipient must be
|
||||||
|
\& specified. Output to stdout or written
|
||||||
|
\& to the file specified via \-O.
|
||||||
|
\& \-d \-\-decrypt Decrypt a message. Read from stdin or
|
||||||
|
\& specified via \-I. Output to stdout or
|
||||||
|
\& written to the file specified via \-O.
|
||||||
|
\& The primary secret key will be used for
|
||||||
|
\& decryption, if there is no primary and
|
||||||
|
\& just one secret key in the vault, this
|
||||||
|
\& one will be used. Otherwise you\*(Aqll have
|
||||||
|
\& to specify the keyid (\-i) of the key.
|
||||||
|
\&
|
||||||
|
\& Encoding Options:
|
||||||
|
\& \-z \-\-z85\-encode Encode something to Z85 encoding. Use
|
||||||
|
\& \-I and \-O respectively, otherwise it
|
||||||
|
\& stdin/stdout.
|
||||||
|
\& \-Z \-\-z85\-decode Decode something from Z85 encoding. Use
|
||||||
|
\& \-I and \-O respectively, otherwise it
|
||||||
|
\& stdin/stdout
|
||||||
|
.Ve
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
.IX Header "DESCRIPTION"
|
||||||
|
\&\fBPretty Curved Privacy\fR (pcp1) is a commandline utility which can
|
||||||
|
be used to encrypt files. \fBpcp1\fR uses eliptc curve cryptography
|
||||||
|
for encryption (\s-1CURVE25519\s0 by Dan J. Bernstein). While \s-1CURVE25519\s0
|
||||||
|
is no worldwide accepted standard it hasn't been compromised by
|
||||||
|
the \s-1NSA\s0 \- which might be better, depending on your point of view.
|
||||||
|
.PP
|
||||||
|
\&\fBCaution\fR: since \s-1CURVE25519\s0 is no accepted standard, \fBpcp1\fR has
|
||||||
|
to be considered as experimental software. In fact, I wrote it just
|
||||||
|
to learn about the curve and see how it works.
|
||||||
|
.PP
|
||||||
|
Beside some differences it works like \fB\s-1GNUPG\s0\fR. So, if you already
|
||||||
|
know how to use gpg, you'll feel almost home.
|
||||||
|
.SH "QUICKSTART"
|
||||||
|
.IX Header "QUICKSTART"
|
||||||
|
Lets say, Alicia and Bobby want to exchange encrypted messages.
|
||||||
|
Here's what the've got to do.
|
||||||
|
.PP
|
||||||
|
First, both have create a secret key:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& Alicia Bobby
|
||||||
|
\& pcp1 \-k pcp1 \-k
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
After entering their name, email address and a passphrase to protect
|
||||||
|
the key, it will be stored in their \fBvault file\fR (by default ~/.pcpvault).
|
||||||
|
.PP
|
||||||
|
Now, both of them have to export the public key part of their key:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& Alicia Bobby
|
||||||
|
\& pcp1 \-p \-O alicia.pub pcp1 \-p \-O bobby.pub
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
They've to exchange the public key somehow (which is not my
|
||||||
|
problem at the moment, use ssh, encrypted mail, whatever). Once exchanged,
|
||||||
|
they have to import it:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& Alicia Bobby
|
||||||
|
\& pcp1 \-P \-I bobby.pub pcp1 \-P \-I alicia.pub
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
They will see a response as this when done:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& key 0x29A323A2C295D391 added to .pcpvault.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Now, Alicia finally writes the secret message, encrypts it and
|
||||||
|
sends it to Bobby, who in turn decrypts it:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& Alicia Bobby
|
||||||
|
\& echo "Love you, honey" > letter
|
||||||
|
\& pcp1 \-e \-i 0x29A323A2C295D391 \-I letter \-O letter.z85
|
||||||
|
\& cat letter.z85 | mail bobby@foo.bar
|
||||||
|
\&
|
||||||
|
\& pcp1 \-d \-I letter.z85 | less
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
And that's it.
|
||||||
|
.PP
|
||||||
|
Please note the big difference to \fB\s-1GPG\s0\fR though: both Alicia
|
||||||
|
\&\s-1AND\s0 Bobby have to enter the passphrase for their secret key!
|
||||||
|
That's the way \s-1CURVE25519\s0 works: you encrypt a message using
|
||||||
|
your secret key and the recipients public key and the recipient
|
||||||
|
does the opposite, he uses his secret key and your public key
|
||||||
|
to actually decrypt the message.
|
||||||
|
.PP
|
||||||
|
Oh \- and if you're wondering why I named them Alicia and Bobby:
|
||||||
|
I was just sick of Alice and Bob. We're running NSA-free, so we're
|
||||||
|
using other sample names as well.
|
||||||
|
.SH "PCP1 KEYS"
|
||||||
|
.IX Header "PCP1 KEYS"
|
||||||
|
\&\fBpcp1\fR keys are stored in a binary file, called \fBthe vault\fR.
|
||||||
|
It's by default located in \fB~/.pcpvault\fR but you can of course
|
||||||
|
specify another location using the \fB\-V\fR option.
|
||||||
|
.PP
|
||||||
|
There are two kinds of keys: secret and public keys. In reality
|
||||||
|
a secret key always includes its public key. Both types of keys
|
||||||
|
can be exported to files and transfered to other people who can
|
||||||
|
then import them. You should usually only do this with public keys
|
||||||
|
though.
|
||||||
|
.PP
|
||||||
|
There is a primary secret key which will always used for operations
|
||||||
|
when no keyid has been specified. However, you may have as many
|
||||||
|
secret keys in your vault as you like.
|
||||||
|
.PP
|
||||||
|
Each key can be identified using its \fBkeyid\fR which looks like this:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& 0xD49119E85266509F
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
A public key exported from a secret key will have the same keyid
|
||||||
|
as the secret key. When using for encryption, the keyid will be
|
||||||
|
added to the message so that the receiver knows who was the
|
||||||
|
sender of the message (\fBThis might change in the future. As of
|
||||||
|
this writing I'm not sure if this was a good idea\fR).
|
||||||
|
.PP
|
||||||
|
If you just want to know details about a key or the vault, use the
|
||||||
|
\&\fB\-t\fR option.
|
||||||
|
.SH "INTERNALS"
|
||||||
|
.IX Header "INTERNALS"
|
||||||
|
\&\s-1FIXME\s0.
|
||||||
|
.SH "Z85 ENCODING"
|
||||||
|
.IX Header "Z85 ENCODING"
|
||||||
|
\&\fBpcp1\fR uses Z85 to encode exported keys and encrypted messages.
|
||||||
|
Therefore it includes a Z85 utility mode:
|
||||||
|
.PP
|
||||||
|
\&\fBpcp1\fR can be used to encode and decode strings to Z85 encoding.
|
||||||
|
.PP
|
||||||
|
The option \fB\-z\fR encodes \fBto\fR Z85, the option \fB\-Z\fR does the opposite
|
||||||
|
and decodes \fBfrom\fR Z85.
|
||||||
|
.PP
|
||||||
|
If no input file have been specified using \fB\-I\fR, \fBpcp1\fR expects the
|
||||||
|
input to come from \fB\s-1STDIN\s0\fR, otherwise it reads the contents
|
||||||
|
of \fBfile\fR.
|
||||||
|
.PP
|
||||||
|
Encoded or decoded output will be written to \fB\s-1STDOUT\s0\fR unless an
|
||||||
|
output file has been specified using the option \fB\-O\fR.
|
||||||
|
.SS "\s-1EXAMPLES\s0"
|
||||||
|
.IX Subsection "EXAMPLES"
|
||||||
|
To encode a given file to Z85 and write the output to another:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& pcp1 \-z myfile.bin > myfile.z85
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To decode the file created above and restore the original:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& pcp1 \-Z \-d myfile.z85 > myfile.bin
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To encode something from stdin to Z85:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& ps axuw | pcp1 \-z > pslist.z85
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To decode the above and print to stdout:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& pcp1 \-Z \-d pslist.z85
|
||||||
|
.Ve
|
||||||
|
.SS "\s-1BACKGROUND\s0"
|
||||||
|
.IX Subsection "BACKGROUND"
|
||||||
|
The Z85 encoding format is described here: \fBhttp://rfc.zeromq.org/spec:32\fR.
|
||||||
|
It's part of ZeroMQ (\fBhttp://zeromq.org\fR). Z85 is based on \s-1ASCII85\s0 with
|
||||||
|
a couple of modifications (portability, readability etc).
|
||||||
|
.PP
|
||||||
|
To fulfil the requirements of the ZeroMQ Z85 functions, \fBpcp1\fR
|
||||||
|
does some additional preparations of raw input before actually doing the
|
||||||
|
encoding, since the input for \fIzmq_z85_encode()\fR must be divisible by 4:
|
||||||
|
.PP
|
||||||
|
Expand the input so that the resulting size is divisible by 4.
|
||||||
|
.PP
|
||||||
|
Fill the added bytes with zeroes.
|
||||||
|
.PP
|
||||||
|
Prepend the input with a one byte value which holds the number of zeroes
|
||||||
|
added in the previous step.
|
||||||
|
.PP
|
||||||
|
Example:
|
||||||
|
.PP
|
||||||
|
Raw input:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& hello\e0
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Here, the input size is 6, which is insufficient, therefore it has to be expanded
|
||||||
|
to be 8. After the process the input looks like this:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& 1hello\e0\e0
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
So, we padded the input with 1 zero (makes 7 bytes) and preprended it with the
|
||||||
|
value 1 (the number of zeros added): makes 8 bytes total.
|
||||||
|
.PP
|
||||||
|
After decoding Z85 input the process will be reversed.
|
||||||
|
.PP
|
||||||
|
\&\fBTrying to use another tool to decode an Z85 encoded string produced
|
||||||
|
by z85, might not work therefore, unless the tool takes the padding scheme
|
||||||
|
outlined above into account\fR.
|
||||||
|
.SH "COPYRIGHT"
|
||||||
|
.IX Header "COPYRIGHT"
|
||||||
|
Copyright (c) 2013 by T.Linden <tom \s-1AT\s0 cpan \s-1DOT\s0 org>
|
||||||
|
.SH "ADDITIONAL COPYRIGHTS"
|
||||||
|
.IX Header "ADDITIONAL COPYRIGHTS"
|
||||||
|
.IP "\fBZeroMQ Z85 encoding routine\fR" 4
|
||||||
|
.IX Item "ZeroMQ Z85 encoding routine"
|
||||||
|
.Vb 5
|
||||||
|
\& Copyright (c) 2007\-2013 iMatix Corporation
|
||||||
|
\& Copyright (c) 2009\-2011 250bpm s.r.o.
|
||||||
|
\& Copyright (c) 2010\-2011 Miru Limited
|
||||||
|
\& Copyright (c) 2011 VMware, Inc.
|
||||||
|
\& Copyright (c) 2012 Spotify AB
|
||||||
|
.Ve
|
||||||
|
.IP "\fBTarsnap readpass helpers\fR" 4
|
||||||
|
.IX Item "Tarsnap readpass helpers"
|
||||||
|
.Vb 1
|
||||||
|
\& Copyright 2009 Colin Percival
|
||||||
|
.Ve
|
||||||
|
.IP "\fB\f(BIjen_hash()\fB hash algorithm\fR" 4
|
||||||
|
.IX Item "jen_hash() hash algorithm"
|
||||||
|
.Vb 1
|
||||||
|
\& Bob Jenkins, Public Domain.
|
||||||
|
.Ve
|
||||||
|
.IP "\fB\s-1UTHASH\s0 hashing macros\fR" 4
|
||||||
|
.IX Item "UTHASH hashing macros"
|
||||||
|
.Vb 1
|
||||||
|
\& Copyright (c) 2003\-2013, Troy D. Hanson
|
||||||
|
.Ve
|
||||||
|
.IP "\fBRandom art image from OpenSSH keygen\fR" 4
|
||||||
|
.IX Item "Random art image from OpenSSH keygen"
|
||||||
|
.Vb 1
|
||||||
|
\& Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
\&
|
||||||
|
\& Comitted by Alexander von Gernler in rev 1.7.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Every incorporated source code is opensource and licensed
|
||||||
|
under the \fB\s-1GPL\s0\fR as well.
|
||||||
|
.SH "AUTHORS"
|
||||||
|
.IX Header "AUTHORS"
|
||||||
|
\&\fIT.Linden <tom \s-1AT\s0 cpan \s-1DOT\s0 org\fR>
|
||||||
|
.SH "LICENSE"
|
||||||
|
.IX Header "LICENSE"
|
||||||
|
Licensed under the \s-1GNU\s0 \s-1GENERAL\s0 \s-1PUBLIC\s0 \s-1LICENSE\s0 version 3.
|
||||||
|
.SH "HOME"
|
||||||
|
.IX Header "HOME"
|
||||||
|
The homepage of Pretty Curved Privacy can be found on
|
||||||
|
http://www.daemon.de/PrettyCurvedPrivacy. The source is
|
||||||
|
on Github: https://github.com/TLINDEN/pcp
|
||||||
306
man/pcp1.pod
Normal file
306
man/pcp1.pod
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Pretty Curved Privacy - File encryption using eliptic curve cryptography.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage: pcp1 [options]
|
||||||
|
|
||||||
|
General Options:
|
||||||
|
-V --vault <vaultfile> Specify an alternate vault file.
|
||||||
|
The deault vault is ~/.pcpvault.
|
||||||
|
-O --outfile <file> Output file. If not specified, stdout
|
||||||
|
will be used.
|
||||||
|
-I --infile <file> Input file. If not specified, stdin
|
||||||
|
will be used.
|
||||||
|
-i --keyid <id> Specify a key id to import/export.
|
||||||
|
-t --text Print textual representation of some
|
||||||
|
item. Either -V or -i must be specified
|
||||||
|
as well.
|
||||||
|
-h --help Print this help message.
|
||||||
|
-v --version Print program version.
|
||||||
|
-D --debug Enable debug output.
|
||||||
|
|
||||||
|
Keymanagement Options:
|
||||||
|
-k --keygen Generate a CURVE25519 secret key. If
|
||||||
|
the generated key is the first one in
|
||||||
|
your vault, it will become the primary
|
||||||
|
secret key.
|
||||||
|
-l --listkeys List all keys currently stored in your
|
||||||
|
vault. Only the key id's and some info
|
||||||
|
about the keys will be printed, not the
|
||||||
|
actual keys.
|
||||||
|
-r --remove-key Remove a key from the vault. Requires
|
||||||
|
option -i <keyid>.
|
||||||
|
-s --export-secret Export a secret key. If your vault only
|
||||||
|
contains one secret key, this one will
|
||||||
|
be exported. If a key id have been
|
||||||
|
specified (-i), this one will be used.
|
||||||
|
If there are more than one secret keys
|
||||||
|
in the vault and no key id has been
|
||||||
|
given, export the primary secret key.
|
||||||
|
Use -O to export to a file.
|
||||||
|
-p --export-public Export a public key. If no key id have
|
||||||
|
been specified, the public part of your
|
||||||
|
primary secret key will be exported.
|
||||||
|
Use -O to export to a file.
|
||||||
|
-S --import-secret Import a secret key. Use -I to import
|
||||||
|
from a file.
|
||||||
|
-P --import-public Import a public key. Use -I to import
|
||||||
|
from a file.
|
||||||
|
|
||||||
|
Encryption Options:
|
||||||
|
-e --encrypt Encrypt a message. Read from stdin or
|
||||||
|
specified via -I. A keyid (-i) of the
|
||||||
|
public key of the receipient must be
|
||||||
|
specified. Output to stdout or written
|
||||||
|
to the file specified via -O.
|
||||||
|
-d --decrypt Decrypt a message. Read from stdin or
|
||||||
|
specified via -I. Output to stdout or
|
||||||
|
written to the file specified via -O.
|
||||||
|
The primary secret key will be used for
|
||||||
|
decryption, if there is no primary and
|
||||||
|
just one secret key in the vault, this
|
||||||
|
one will be used. Otherwise you'll have
|
||||||
|
to specify the keyid (-i) of the key.
|
||||||
|
|
||||||
|
Encoding Options:
|
||||||
|
-z --z85-encode Encode something to Z85 encoding. Use
|
||||||
|
-I and -O respectively, otherwise it
|
||||||
|
stdin/stdout.
|
||||||
|
-Z --z85-decode Decode something from Z85 encoding. Use
|
||||||
|
-I and -O respectively, otherwise it
|
||||||
|
stdin/stdout
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<Pretty Curved Privacy> (pcp1) is a commandline utility which can
|
||||||
|
be used to encrypt files. B<pcp1> uses eliptc curve cryptography
|
||||||
|
for encryption (CURVE25519 by Dan J. Bernstein). While CURVE25519
|
||||||
|
is no worldwide accepted standard it hasn't been compromised by
|
||||||
|
the NSA - which might be better, depending on your point of view.
|
||||||
|
|
||||||
|
B<Caution>: since CURVE25519 is no accepted standard, B<pcp1> has
|
||||||
|
to be considered as experimental software. In fact, I wrote it just
|
||||||
|
to learn about the curve and see how it works.
|
||||||
|
|
||||||
|
Beside some differences it works like B<GNUPG>. So, if you already
|
||||||
|
know how to use gpg, you'll feel almost home.
|
||||||
|
|
||||||
|
=head1 QUICKSTART
|
||||||
|
|
||||||
|
Lets say, Alicia and Bobby want to exchange encrypted messages.
|
||||||
|
Here's what the've got to do.
|
||||||
|
|
||||||
|
First, both have create a secret key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -k pcp1 -k
|
||||||
|
|
||||||
|
After entering their name, email address and a passphrase to protect
|
||||||
|
the key, it will be stored in their B<vault file> (by default ~/.pcpvault).
|
||||||
|
|
||||||
|
Now, both of them have to export the public key part of their key:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -p -O alicia.pub pcp1 -p -O bobby.pub
|
||||||
|
|
||||||
|
They've to exchange the public key somehow (which is not my
|
||||||
|
problem at the moment, use ssh, encrypted mail, whatever). Once exchanged,
|
||||||
|
they have to import it:
|
||||||
|
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
pcp1 -P -I bobby.pub pcp1 -P -I alicia.pub
|
||||||
|
|
||||||
|
They will see a response as this when done:
|
||||||
|
|
||||||
|
key 0x29A323A2C295D391 added to .pcpvault.
|
||||||
|
|
||||||
|
Now, Alicia finally writes the secret message, encrypts it and
|
||||||
|
sends it to Bobby, who in turn decrypts it:
|
||||||
|
|
||||||
|
Alicia Bobby
|
||||||
|
echo "Love you, honey" > letter
|
||||||
|
pcp1 -e -i 0x29A323A2C295D391 -I letter -O letter.z85
|
||||||
|
cat letter.z85 | mail bobby@foo.bar
|
||||||
|
|
||||||
|
pcp1 -d -I letter.z85 | less
|
||||||
|
|
||||||
|
And that's it.
|
||||||
|
|
||||||
|
Please note the big difference to B<GPG> though: both Alicia
|
||||||
|
AND Bobby have to enter the passphrase for their secret key!
|
||||||
|
That's the way CURVE25519 works: you encrypt a message using
|
||||||
|
your secret key and the recipients public key and the recipient
|
||||||
|
does the opposite, he uses his secret key and your public key
|
||||||
|
to actually decrypt the message.
|
||||||
|
|
||||||
|
Oh - and if you're wondering why I named them Alicia and Bobby:
|
||||||
|
I was just sick of Alice and Bob. We're running NSA-free, so we're
|
||||||
|
using other sample names as well.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 PCP1 KEYS
|
||||||
|
|
||||||
|
B<pcp1> keys are stored in a binary file, called B<the vault>.
|
||||||
|
It's by default located in B<~/.pcpvault> but you can of course
|
||||||
|
specify another location using the B<-V> option.
|
||||||
|
|
||||||
|
There are two kinds of keys: secret and public keys. In reality
|
||||||
|
a secret key always includes its public key. Both types of keys
|
||||||
|
can be exported to files and transfered to other people who can
|
||||||
|
then import them. You should usually only do this with public keys
|
||||||
|
though.
|
||||||
|
|
||||||
|
There is a primary secret key which will always used for operations
|
||||||
|
when no keyid has been specified. However, you may have as many
|
||||||
|
secret keys in your vault as you like.
|
||||||
|
|
||||||
|
Each key can be identified using its B<keyid> which looks like this:
|
||||||
|
|
||||||
|
0xD49119E85266509F
|
||||||
|
|
||||||
|
A public key exported from a secret key will have the same keyid
|
||||||
|
as the secret key. When using for encryption, the keyid will be
|
||||||
|
added to the message so that the receiver knows who was the
|
||||||
|
sender of the message (B<This might change in the future. As of
|
||||||
|
this writing I'm not sure if this was a good idea>).
|
||||||
|
|
||||||
|
If you just want to know details about a key or the vault, use the
|
||||||
|
B<-t> option.
|
||||||
|
|
||||||
|
=head1 INTERNALS
|
||||||
|
|
||||||
|
FIXME.
|
||||||
|
|
||||||
|
=head1 Z85 ENCODING
|
||||||
|
|
||||||
|
B<pcp1> uses Z85 to encode exported keys and encrypted messages.
|
||||||
|
Therefore it includes a Z85 utility mode:
|
||||||
|
|
||||||
|
B<pcp1> can be used to encode and decode strings to Z85 encoding.
|
||||||
|
|
||||||
|
The option B<-z> encodes B<to> Z85, the option B<-Z> does the opposite
|
||||||
|
and decodes B<from> Z85.
|
||||||
|
|
||||||
|
If no input file have been specified using B<-I>, B<pcp1> expects the
|
||||||
|
input to come from B<STDIN>, otherwise it reads the contents
|
||||||
|
of B<file>.
|
||||||
|
|
||||||
|
Encoded or decoded output will be written to B<STDOUT> unless an
|
||||||
|
output file has been specified using the option B<-O>.
|
||||||
|
|
||||||
|
=head2 EXAMPLES
|
||||||
|
|
||||||
|
To encode a given file to Z85 and write the output to another:
|
||||||
|
|
||||||
|
pcp1 -z myfile.bin > myfile.z85
|
||||||
|
|
||||||
|
To decode the file created above and restore the original:
|
||||||
|
|
||||||
|
pcp1 -Z -d myfile.z85 > myfile.bin
|
||||||
|
|
||||||
|
To encode something from stdin to Z85:
|
||||||
|
|
||||||
|
ps axuw | pcp1 -z > pslist.z85
|
||||||
|
|
||||||
|
To decode the above and print to stdout:
|
||||||
|
|
||||||
|
pcp1 -Z -d pslist.z85
|
||||||
|
|
||||||
|
=head2 BACKGROUND
|
||||||
|
|
||||||
|
The Z85 encoding format is described here: B<http://rfc.zeromq.org/spec:32>.
|
||||||
|
It's part of ZeroMQ (B<http://zeromq.org>). Z85 is based on ASCII85 with
|
||||||
|
a couple of modifications (portability, readability etc).
|
||||||
|
|
||||||
|
To fulfil the requirements of the ZeroMQ Z85 functions, B<pcp1>
|
||||||
|
does some additional preparations of raw input before actually doing the
|
||||||
|
encoding, since the input for zmq_z85_encode() must be divisible by 4:
|
||||||
|
|
||||||
|
Expand the input so that the resulting size is divisible by 4.
|
||||||
|
|
||||||
|
Fill the added bytes with zeroes.
|
||||||
|
|
||||||
|
Prepend the input with a one byte value which holds the number of zeroes
|
||||||
|
added in the previous step.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Raw input:
|
||||||
|
|
||||||
|
hello\0
|
||||||
|
|
||||||
|
Here, the input size is 6, which is insufficient, therefore it has to be expanded
|
||||||
|
to be 8. After the process the input looks like this:
|
||||||
|
|
||||||
|
1hello\0\0
|
||||||
|
|
||||||
|
So, we padded the input with 1 zero (makes 7 bytes) and preprended it with the
|
||||||
|
value 1 (the number of zeros added): makes 8 bytes total.
|
||||||
|
|
||||||
|
After decoding Z85 input the process will be reversed.
|
||||||
|
|
||||||
|
B<Trying to use another tool to decode an Z85 encoded string produced
|
||||||
|
by z85, might not work therefore, unless the tool takes the padding scheme
|
||||||
|
outlined above into account>.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2013 by T.Linden <tom AT cpan DOT org>
|
||||||
|
|
||||||
|
=head1 ADDITIONAL COPYRIGHTS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<ZeroMQ Z85 encoding routine>
|
||||||
|
|
||||||
|
Copyright (c) 2007-2013 iMatix Corporation
|
||||||
|
Copyright (c) 2009-2011 250bpm s.r.o.
|
||||||
|
Copyright (c) 2010-2011 Miru Limited
|
||||||
|
Copyright (c) 2011 VMware, Inc.
|
||||||
|
Copyright (c) 2012 Spotify AB
|
||||||
|
|
||||||
|
=item B<Tarsnap readpass helpers>
|
||||||
|
|
||||||
|
Copyright 2009 Colin Percival
|
||||||
|
|
||||||
|
=item B<jen_hash() hash algorithm>
|
||||||
|
|
||||||
|
Bob Jenkins, Public Domain.
|
||||||
|
|
||||||
|
=item B<UTHASH hashing macros>
|
||||||
|
|
||||||
|
Copyright (c) 2003-2013, Troy D. Hanson
|
||||||
|
|
||||||
|
=item B<Random art image from OpenSSH keygen>
|
||||||
|
|
||||||
|
Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
|
||||||
|
Comitted by Alexander von Gernler in rev 1.7.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Every incorporated source code is opensource and licensed
|
||||||
|
under the B<GPL> as well.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
I<T.Linden <tom AT cpan DOT org>>
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
=head1 HOME
|
||||||
|
|
||||||
|
The homepage of Pretty Curved Privacy can be found on
|
||||||
|
http://www.daemon.de/PrettyCurvedPrivacy. The source is
|
||||||
|
on Github: https://github.com/TLINDEN/pcp
|
||||||
|
|
||||||
|
=cut
|
||||||
231
man/z85.1
Normal file
231
man/z85.1
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
|
||||||
|
.\"
|
||||||
|
.\" Standard preamble:
|
||||||
|
.\" ========================================================================
|
||||||
|
.de Sp \" Vertical space (when we can't use .PP)
|
||||||
|
.if t .sp .5v
|
||||||
|
.if n .sp
|
||||||
|
..
|
||||||
|
.de Vb \" Begin verbatim text
|
||||||
|
.ft CW
|
||||||
|
.nf
|
||||||
|
.ne \\$1
|
||||||
|
..
|
||||||
|
.de Ve \" End verbatim text
|
||||||
|
.ft R
|
||||||
|
.fi
|
||||||
|
..
|
||||||
|
.\" Set up some character translations and predefined strings. \*(-- will
|
||||||
|
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
||||||
|
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
||||||
|
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
||||||
|
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
||||||
|
.\" nothing in troff, for use with C<>.
|
||||||
|
.tr \(*W-
|
||||||
|
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||||
|
.ie n \{\
|
||||||
|
. ds -- \(*W-
|
||||||
|
. ds PI pi
|
||||||
|
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||||
|
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||||
|
. ds L" ""
|
||||||
|
. ds R" ""
|
||||||
|
. ds C` ""
|
||||||
|
. ds C' ""
|
||||||
|
'br\}
|
||||||
|
.el\{\
|
||||||
|
. ds -- \|\(em\|
|
||||||
|
. ds PI \(*p
|
||||||
|
. ds L" ``
|
||||||
|
. ds R" ''
|
||||||
|
'br\}
|
||||||
|
.\"
|
||||||
|
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||||
|
.ie \n(.g .ds Aq \(aq
|
||||||
|
.el .ds Aq '
|
||||||
|
.\"
|
||||||
|
.\" If the F register is turned on, we'll generate index entries on stderr for
|
||||||
|
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||||
|
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||||
|
.\" output yourself in some meaningful fashion.
|
||||||
|
.ie \nF \{\
|
||||||
|
. de IX
|
||||||
|
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||||
|
..
|
||||||
|
. nr % 0
|
||||||
|
. rr F
|
||||||
|
.\}
|
||||||
|
.el \{\
|
||||||
|
. de IX
|
||||||
|
..
|
||||||
|
.\}
|
||||||
|
.\"
|
||||||
|
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||||
|
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||||
|
. \" fudge factors for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds #H 0
|
||||||
|
. ds #V .8m
|
||||||
|
. ds #F .3m
|
||||||
|
. ds #[ \f1
|
||||||
|
. ds #] \fP
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||||
|
. ds #V .6m
|
||||||
|
. ds #F 0
|
||||||
|
. ds #[ \&
|
||||||
|
. ds #] \&
|
||||||
|
.\}
|
||||||
|
. \" simple accents for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds ' \&
|
||||||
|
. ds ` \&
|
||||||
|
. ds ^ \&
|
||||||
|
. ds , \&
|
||||||
|
. ds ~ ~
|
||||||
|
. ds /
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||||
|
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||||
|
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||||
|
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||||
|
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||||
|
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||||
|
.\}
|
||||||
|
. \" troff and (daisy-wheel) nroff accents
|
||||||
|
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||||
|
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||||
|
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||||
|
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||||
|
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||||
|
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||||
|
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||||
|
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||||
|
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||||
|
. \" corrections for vroff
|
||||||
|
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||||
|
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||||
|
. \" for low resolution devices (crt and lpr)
|
||||||
|
.if \n(.H>23 .if \n(.V>19 \
|
||||||
|
\{\
|
||||||
|
. ds : e
|
||||||
|
. ds 8 ss
|
||||||
|
. ds o a
|
||||||
|
. ds d- d\h'-1'\(ga
|
||||||
|
. ds D- D\h'-1'\(hy
|
||||||
|
. ds th \o'bp'
|
||||||
|
. ds Th \o'LP'
|
||||||
|
. ds ae ae
|
||||||
|
. ds Ae AE
|
||||||
|
.\}
|
||||||
|
.rm #[ #] #H #V #F C
|
||||||
|
.\" ========================================================================
|
||||||
|
.\"
|
||||||
|
.IX Title "Z85 1"
|
||||||
|
.TH Z85 1 "2013-10-25" "Z85 0.0.1" "USER CONTRIBUTED DOCUMENTATION"
|
||||||
|
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||||
|
.\" way too many mistakes in technical documents.
|
||||||
|
.if n .ad l
|
||||||
|
.nh
|
||||||
|
.SH "NAME"
|
||||||
|
z85 \- encode and decode strings to Z85 encoding.
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
.IX Header "SYNOPSIS"
|
||||||
|
.Vb 1
|
||||||
|
\& Usage: z85 [options] [<file>]
|
||||||
|
\&
|
||||||
|
\& Options:
|
||||||
|
\& \-e encode input to Z85
|
||||||
|
\& \-d decode input from Z85
|
||||||
|
\& \-h print this help message
|
||||||
|
\& \-v print program version
|
||||||
|
.Ve
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
.IX Header "DESCRIPTION"
|
||||||
|
\&\fBz85\fR can be used to encode and decode strings to Z85 encoding.
|
||||||
|
.PP
|
||||||
|
The option \fB\-e\fR encodes \fBto\fR Z85, which is the default if
|
||||||
|
no option have been specified. The option \fB\-d\fR does the opposite
|
||||||
|
and decodes b<from> Z85.
|
||||||
|
.PP
|
||||||
|
If no input file have been specified, \fBz85\fR expects the
|
||||||
|
input to come from \fB\s-1STDIN\s0\fR, otherwise it reads the contents
|
||||||
|
of \fBfile\fR.
|
||||||
|
.PP
|
||||||
|
Encoded or decoded output will always be written to \fB\s-1STDOUT\s0\fR.
|
||||||
|
.SH "EXAMPLES"
|
||||||
|
.IX Header "EXAMPLES"
|
||||||
|
To encode a given file to Z85 and write the output to another:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& z85 \-e myfile.bin > myfile.z85
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To decode the file created above and restore the original:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& z85 \-d myfile.z85 > myfile.bin
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To encode something from stdin to Z85:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& ps axuw | z85 > pslist.z85
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
To decode the above and print to stdout:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& z85 \-d pslist.z85
|
||||||
|
.Ve
|
||||||
|
.SH "BACKGROUND"
|
||||||
|
.IX Header "BACKGROUND"
|
||||||
|
The Z85 encoding format is described here: <http://rfc.zeromq.org/spec:32>.
|
||||||
|
It's part of ZeroMQ (<http://zeromq.org>). Z85 is based on \s-1ASCII85\s0 with
|
||||||
|
a couple of modifications (portability, readability etc).
|
||||||
|
.PP
|
||||||
|
To fulfil the requirements of the ZeroMQ Z85 functions, the \fBz85\fR utility
|
||||||
|
does some additional preparations of raw input before actually doing the
|
||||||
|
encoding, since the input for \fIzmq_z85_encode()\fR must be divisible by 4:
|
||||||
|
.PP
|
||||||
|
Expand the input so that the resulting size is divisible by 4.
|
||||||
|
.PP
|
||||||
|
Fill the added bytes with zeroes.
|
||||||
|
.PP
|
||||||
|
Prepend the input with a one byte value which holds the number of zeroes
|
||||||
|
added in the previous step.
|
||||||
|
.PP
|
||||||
|
Example:
|
||||||
|
.PP
|
||||||
|
Raw input:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& hello\e0
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Here, the input size is 6, which is insufficient, therefore it has to be expanded
|
||||||
|
to be 8. After the process the input looks like this:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& 1hello\e0\e0
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
So, we padded the input with 1 zero (makes 7 bytes) and preprended it with the
|
||||||
|
value 1 (the number of zeros added): makes 8 bytes total.
|
||||||
|
.PP
|
||||||
|
After decoding Z85 input the process will be reversed.
|
||||||
|
.PP
|
||||||
|
\&\fBTrying to use another tool to decode an Z85 encoded string produced
|
||||||
|
by z85, might not work therefore, unless the tool takes the padding scheme
|
||||||
|
outlined above into account\fR.
|
||||||
|
.SH "COPYRIGHT"
|
||||||
|
.IX Header "COPYRIGHT"
|
||||||
|
Copyright (c) 2013 by T.Linden <tom \s-1AT\s0 cpan \s-1DOT\s0 org>
|
||||||
|
.SH "AUTHORS"
|
||||||
|
.IX Header "AUTHORS"
|
||||||
|
\&\fIT.Linden <tom \s-1AT\s0 cpan \s-1DOT\s0 org\fR>
|
||||||
|
.SH "LICENSE"
|
||||||
|
.IX Header "LICENSE"
|
||||||
|
Licensed under the \s-1GNU\s0 \s-1GENERAL\s0 \s-1PUBLIC\s0 \s-1LICENSE\s0 version 3.
|
||||||
99
man/z85.pod
Normal file
99
man/z85.pod
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# -*-cperl-*-
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
z85 - encode and decode strings to Z85 encoding.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Usage: z85 [options] [<file>]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-e encode input to Z85
|
||||||
|
-d decode input from Z85
|
||||||
|
-h print this help message
|
||||||
|
-v print program version
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<z85> can be used to encode and decode strings to Z85 encoding.
|
||||||
|
|
||||||
|
The option B<-e> encodes B<to> Z85, which is the default if
|
||||||
|
no option have been specified. The option B<-d> does the opposite
|
||||||
|
and decodes b<from> Z85.
|
||||||
|
|
||||||
|
If no input file have been specified, B<z85> expects the
|
||||||
|
input to come from B<STDIN>, otherwise it reads the contents
|
||||||
|
of B<file>.
|
||||||
|
|
||||||
|
Encoded or decoded output will always be written to B<STDOUT>.
|
||||||
|
|
||||||
|
=head1 EXAMPLES
|
||||||
|
|
||||||
|
To encode a given file to Z85 and write the output to another:
|
||||||
|
|
||||||
|
z85 -e myfile.bin > myfile.z85
|
||||||
|
|
||||||
|
To decode the file created above and restore the original:
|
||||||
|
|
||||||
|
z85 -d myfile.z85 > myfile.bin
|
||||||
|
|
||||||
|
To encode something from stdin to Z85:
|
||||||
|
|
||||||
|
ps axuw | z85 > pslist.z85
|
||||||
|
|
||||||
|
To decode the above and print to stdout:
|
||||||
|
|
||||||
|
z85 -d pslist.z85
|
||||||
|
|
||||||
|
=head1 BACKGROUND
|
||||||
|
|
||||||
|
The Z85 encoding format is described here: L<http://rfc.zeromq.org/spec:32>.
|
||||||
|
It's part of ZeroMQ (L<http://zeromq.org>). Z85 is based on ASCII85 with
|
||||||
|
a couple of modifications (portability, readability etc).
|
||||||
|
|
||||||
|
To fulfil the requirements of the ZeroMQ Z85 functions, the B<z85> utility
|
||||||
|
does some additional preparations of raw input before actually doing the
|
||||||
|
encoding, since the input for zmq_z85_encode() must be divisible by 4:
|
||||||
|
|
||||||
|
Expand the input so that the resulting size is divisible by 4.
|
||||||
|
|
||||||
|
Fill the added bytes with zeroes.
|
||||||
|
|
||||||
|
Prepend the input with a one byte value which holds the number of zeroes
|
||||||
|
added in the previous step.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Raw input:
|
||||||
|
|
||||||
|
hello\0
|
||||||
|
|
||||||
|
Here, the input size is 6, which is insufficient, therefore it has to be expanded
|
||||||
|
to be 8. After the process the input looks like this:
|
||||||
|
|
||||||
|
1hello\0\0
|
||||||
|
|
||||||
|
So, we padded the input with 1 zero (makes 7 bytes) and preprended it with the
|
||||||
|
value 1 (the number of zeros added): makes 8 bytes total.
|
||||||
|
|
||||||
|
After decoding Z85 input the process will be reversed.
|
||||||
|
|
||||||
|
B<Trying to use another tool to decode an Z85 encoded string produced
|
||||||
|
by z85, might not work therefore, unless the tool takes the padding scheme
|
||||||
|
outlined above into account>.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2013 by T.Linden <tom AT cpan DOT org>
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
I<T.Linden <tom AT cpan DOT org>>
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
9
src/Makefile.am
Normal file
9
src/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
EXTRA_DIST = z85util.c
|
||||||
|
|
||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
|
||||||
|
bin_PROGRAMS = pcp1
|
||||||
|
|
||||||
|
pcp1_LDADD = ../libpcp/.libs/libpcp1.a
|
||||||
|
pcp1_SOURCES = pcp.c keymgmt.c keyprint.c readpass.c encryption.c z85util.c
|
||||||
|
|
||||||
561
src/Makefile.in
Normal file
561
src/Makefile.in
Normal file
@@ -0,0 +1,561 @@
|
|||||||
|
# Makefile.in generated by automake 1.12.4 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2012 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__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
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@
|
||||||
|
bin_PROGRAMS = pcp1$(EXEEXT)
|
||||||
|
subdir = src
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||||
|
$(top_srcdir)/config/depcomp
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
|
||||||
|
$(top_srcdir)/config/ltoptions.m4 \
|
||||||
|
$(top_srcdir)/config/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/config/ltversion.m4 \
|
||||||
|
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/libpcp/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am__installdirs = "$(DESTDIR)$(bindir)"
|
||||||
|
PROGRAMS = $(bin_PROGRAMS)
|
||||||
|
am_pcp1_OBJECTS = pcp.$(OBJEXT) keymgmt.$(OBJEXT) keyprint.$(OBJEXT) \
|
||||||
|
readpass.$(OBJEXT) encryption.$(OBJEXT) z85util.$(OBJEXT)
|
||||||
|
pcp1_OBJECTS = $(am_pcp1_OBJECTS)
|
||||||
|
pcp1_DEPENDENCIES = ../libpcp/.libs/libpcp1.a
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libpcp
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||||
|
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(pcp1_SOURCES)
|
||||||
|
DIST_SOURCES = $(pcp1_SOURCES)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
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@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
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@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
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@
|
||||||
|
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@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
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@
|
||||||
|
EXTRA_DIST = z85util.c
|
||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
pcp1_LDADD = ../libpcp/.libs/libpcp1.a
|
||||||
|
pcp1_SOURCES = pcp.c keymgmt.c keyprint.c readpass.c encryption.c z85util.c
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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) --gnu src/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu src/Makefile
|
||||||
|
.PRECIOUS: 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_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
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
|
||||||
|
pcp1$(EXEEXT): $(pcp1_OBJECTS) $(pcp1_DEPENDENCIES) $(EXTRA_pcp1_DEPENDENCIES)
|
||||||
|
@rm -f pcp1$(EXEEXT)
|
||||||
|
$(LINK) $(pcp1_OBJECTS) $(pcp1_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encryption.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keymgmt.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyprint.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcp.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readpass.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/z85util.Po@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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"
|
||||||
|
|
||||||
|
cscopelist: $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP)'; \
|
||||||
|
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
|
||||||
|
|
||||||
|
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 $(PROGRAMS)
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(bindir)"; 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-binPROGRAMS clean-generic clean-libtool mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am:
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am: install-binPROGRAMS
|
||||||
|
|
||||||
|
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 -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-binPROGRAMS
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
|
||||||
|
clean-generic clean-libtool cscopelist ctags distclean \
|
||||||
|
distclean-compile distclean-generic distclean-libtool \
|
||||||
|
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||||
|
install install-am install-binPROGRAMS install-data \
|
||||||
|
install-data-am 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 mostlyclean mostlyclean-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags uninstall uninstall-am uninstall-binPROGRAMS
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
247
src/encryption.c
Normal file
247
src/encryption.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
#include "encryption.h"
|
||||||
|
|
||||||
|
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd) {
|
||||||
|
FILE *in = NULL;
|
||||||
|
FILE *out = NULL;
|
||||||
|
pcp_pubkey_t *public = NULL;
|
||||||
|
pcp_key_t *secret = NULL;
|
||||||
|
|
||||||
|
if(useid) {
|
||||||
|
HASH_FIND_STR(pcpkey_hash, id, secret);
|
||||||
|
if(secret == NULL) {
|
||||||
|
fatal("Could not find a secret key with id 0x%s in vault %s!\n",
|
||||||
|
id, vault->filename);
|
||||||
|
goto errde3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
secret = pcp_find_primary_secret();
|
||||||
|
if(secret == NULL) {
|
||||||
|
fatal("Could not find a secret key in vault %s!\n", id, vault->filename);
|
||||||
|
goto errde3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
goto errde2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outfile == NULL)
|
||||||
|
out = stdout;
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not open output file %s\n", outfile);
|
||||||
|
goto errde2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(secret->secret[0] == 0) {
|
||||||
|
// encrypted, decrypt it
|
||||||
|
char *passphrase;
|
||||||
|
if(passwd == NULL) {
|
||||||
|
pcp_readpass(&passphrase,
|
||||||
|
"Enter passphrase to decrypt your secret key", NULL, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
passphrase = ucmalloc(strlen(passwd)+1);
|
||||||
|
strncpy(passphrase, passwd, strlen(passwd)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
secret = pcpkey_decrypt(secret, passphrase);
|
||||||
|
if(secret == NULL)
|
||||||
|
goto errde3;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *encoded = pcp_readz85file(in);
|
||||||
|
if(encoded == NULL)
|
||||||
|
goto errde2;
|
||||||
|
|
||||||
|
size_t clen;
|
||||||
|
unsigned char *combined = pcp_z85_decode((char *)encoded, &clen);
|
||||||
|
|
||||||
|
if(combined == NULL)
|
||||||
|
goto errde1;
|
||||||
|
|
||||||
|
char *senderid = ucmalloc(17);
|
||||||
|
memcpy(senderid, combined, 16);
|
||||||
|
senderid[16] = '\0';
|
||||||
|
|
||||||
|
HASH_FIND_STR(pcppubkey_hash, senderid, public);
|
||||||
|
if(public == NULL) {
|
||||||
|
fatal("Could not find a public key with id 0x%s in vault %s!\n",
|
||||||
|
senderid, vault->filename);
|
||||||
|
goto errde0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(debug) {
|
||||||
|
fprintf(stderr, "Using secret key:\n");
|
||||||
|
pcpkey_printshortinfo(secret);
|
||||||
|
fprintf(stderr, "Using publickey:\n");
|
||||||
|
pcppubkey_printshortinfo(public);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *encrypted = ucmalloc(clen - 16);
|
||||||
|
memcpy(encrypted, &combined[16], clen - 16);
|
||||||
|
|
||||||
|
size_t dlen;
|
||||||
|
unsigned char *decrypted = pcp_box_decrypt(secret, public,
|
||||||
|
encrypted, clen - 16, &dlen);
|
||||||
|
|
||||||
|
if(decrypted != NULL) {
|
||||||
|
fwrite(decrypted, dlen, 1, out);
|
||||||
|
fclose(out);
|
||||||
|
if(ferror(out) != 0) {
|
||||||
|
fatal("Failed to write decrypted output!\n");
|
||||||
|
}
|
||||||
|
free(decrypted);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Decrypted %d bytes from 0x%s successfully\n",
|
||||||
|
(int)dlen, senderid);
|
||||||
|
|
||||||
|
free(encrypted);
|
||||||
|
|
||||||
|
errde0:
|
||||||
|
free(senderid);
|
||||||
|
free(combined);
|
||||||
|
|
||||||
|
errde1:
|
||||||
|
free(encoded);
|
||||||
|
|
||||||
|
errde2:
|
||||||
|
|
||||||
|
errde3:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd) {
|
||||||
|
FILE *in = NULL;
|
||||||
|
FILE *out = NULL;
|
||||||
|
pcp_pubkey_t *public = NULL;
|
||||||
|
pcp_key_t *secret = NULL;
|
||||||
|
|
||||||
|
// look if we've got that key
|
||||||
|
HASH_FIND_STR(pcppubkey_hash, id, public);
|
||||||
|
if(public == NULL) {
|
||||||
|
fatal("Could not find a public key with id 0x%s in vault %s!\n",
|
||||||
|
id, vault->filename);
|
||||||
|
goto erren3;
|
||||||
|
}
|
||||||
|
|
||||||
|
secret = pcp_find_primary_secret();
|
||||||
|
if(secret == NULL) {
|
||||||
|
fatal("Could not find a secret key in vault %s!\n", id, vault->filename);
|
||||||
|
goto erren2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
goto erren1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outfile == NULL)
|
||||||
|
out = stdout;
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not open output file %s\n", outfile);
|
||||||
|
goto erren1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(secret->secret[0] == 0) {
|
||||||
|
// encrypted, decrypt it
|
||||||
|
char *passphrase;
|
||||||
|
if(passwd == NULL) {
|
||||||
|
pcp_readpass(&passphrase,
|
||||||
|
"Enter passphrase to decrypt your secret key", NULL, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
passphrase = ucmalloc(strlen(passwd)+1);
|
||||||
|
strncpy(passphrase, passwd, strlen(passwd)+1);
|
||||||
|
}
|
||||||
|
secret = pcpkey_decrypt(secret, passphrase);
|
||||||
|
if(secret == NULL)
|
||||||
|
goto erren2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(debug) {
|
||||||
|
fprintf(stderr, "Using secret key:\n");
|
||||||
|
pcpkey_printshortinfo(secret);
|
||||||
|
fprintf(stderr, "Using publickey:\n");
|
||||||
|
pcppubkey_printshortinfo(public);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *input = NULL;
|
||||||
|
size_t inputBufSize = 0;
|
||||||
|
unsigned char byte[1];
|
||||||
|
|
||||||
|
while(!feof(in)) {
|
||||||
|
if(!fread(&byte, 1, 1, in))
|
||||||
|
break;
|
||||||
|
unsigned char *tmp = realloc(input, inputBufSize + 1);
|
||||||
|
input = tmp;
|
||||||
|
memmove(&input[inputBufSize], byte, 1);
|
||||||
|
inputBufSize ++;
|
||||||
|
}
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
if(inputBufSize == 0) {
|
||||||
|
fatal("Input file is empty!\n");
|
||||||
|
goto erren1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ciphersize;
|
||||||
|
unsigned char *cipher = pcp_box_encrypt(secret, public, input,
|
||||||
|
inputBufSize, &ciphersize);
|
||||||
|
if(cipher == NULL)
|
||||||
|
goto erren1;
|
||||||
|
|
||||||
|
size_t zlen;
|
||||||
|
size_t clen = ciphersize + 16;
|
||||||
|
unsigned char *combined = ucmalloc(clen);
|
||||||
|
memcpy(combined, secret->id, 16);
|
||||||
|
memcpy(&combined[16], cipher, clen - 16);
|
||||||
|
|
||||||
|
// combined consists of:
|
||||||
|
// keyid|nonce|cipher
|
||||||
|
char *encoded = pcp_z85_encode(combined, clen, &zlen);
|
||||||
|
|
||||||
|
if(encoded == NULL)
|
||||||
|
goto erren0;
|
||||||
|
|
||||||
|
fprintf(out, "%s\n%s\n%s\n", PCP_ENFILE_HEADER, encoded, PCP_ENFILE_FOOTER);
|
||||||
|
if(ferror(out) != 0) {
|
||||||
|
fatal("Failed to write encrypted output!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Encrypted %d bytes for 0x%s successfully\n",
|
||||||
|
(int)inputBufSize, id);
|
||||||
|
|
||||||
|
fclose(out);
|
||||||
|
free(encoded);
|
||||||
|
free(combined);
|
||||||
|
free(cipher);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
erren0:
|
||||||
|
free(cipher);
|
||||||
|
|
||||||
|
erren1:
|
||||||
|
|
||||||
|
erren2:
|
||||||
|
|
||||||
|
erren3:
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
18
src/encryption.h
Normal file
18
src/encryption.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef _HAVE_ENCRYPTION_H
|
||||||
|
#define _HAVE_ENCRYPTION_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "crypto.h"
|
||||||
|
#include "pcp.h"
|
||||||
|
#include "uthash.h"
|
||||||
|
#include "z85.h"
|
||||||
|
#include "keyprint.h"
|
||||||
|
|
||||||
|
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd);
|
||||||
|
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd);
|
||||||
|
|
||||||
|
#endif // _HAVE_ENCRYPTION_H
|
||||||
510
src/keymgmt.c
Normal file
510
src/keymgmt.c
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
#include "keymgmt.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char *pcp_getstdin(const char *prompt) {
|
||||||
|
char line[1024];
|
||||||
|
char *out;
|
||||||
|
|
||||||
|
fprintf(stderr, "%s: ", prompt);
|
||||||
|
|
||||||
|
if (fgets(line, 1024, stdin) == NULL) {
|
||||||
|
fatal("Cannot read from stdin");
|
||||||
|
goto errgst;
|
||||||
|
}
|
||||||
|
|
||||||
|
line[strcspn(line, "\r\n")] = '\0';
|
||||||
|
|
||||||
|
if ((out = strdup(line)) == NULL) {
|
||||||
|
fatal("Cannot allocate memory");
|
||||||
|
goto errgst;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
|
||||||
|
errgst:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pcp_storekey (pcp_key_t *key) {
|
||||||
|
if(vault->isnew == 1 || HASH_COUNT(pcpkey_hash) == 0) {
|
||||||
|
key->type = PCP_KEY_TYPE_MAINSECRET;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pcpvault_additem(vault, key, sizeof(pcp_key_t), key->type, 1) == 0) {
|
||||||
|
if(vault->isnew)
|
||||||
|
fprintf(stderr, "new vault created, ");
|
||||||
|
fprintf(stderr, "key 0x%s added to %s.\n", key->id, vault->filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_keygen(char *passwd) {
|
||||||
|
pcp_key_t *k = pcpkey_new ();
|
||||||
|
|
||||||
|
char *owner = pcp_getstdin("Enter the name of the key owner");
|
||||||
|
memcpy(k->owner, owner, strlen(owner) + 1);
|
||||||
|
|
||||||
|
char *mail = pcp_getstdin("Enter the email address of the key owner");
|
||||||
|
memcpy(k->mail, mail, strlen(mail) + 1);
|
||||||
|
|
||||||
|
if(debug)
|
||||||
|
pcp_dumpkey(k);
|
||||||
|
|
||||||
|
char *passphrase;
|
||||||
|
if(passwd == NULL) {
|
||||||
|
pcp_readpass(&passphrase,
|
||||||
|
"Enter passphrase for key encryption",
|
||||||
|
"Enter the passphrase again", 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
passphrase = ucmalloc(strlen(passwd)+1);
|
||||||
|
strncpy(passphrase, passwd, strlen(passwd)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *key = pcpkey_encrypt(k, passphrase);
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
if(pcp_storekey(key) == 0) {
|
||||||
|
fprintf(stderr, "Generated new secret key:\n");
|
||||||
|
pcpkey_printshortinfo(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(k);
|
||||||
|
free(mail);
|
||||||
|
free(owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_listkeys() {
|
||||||
|
pcp_key_t *k;
|
||||||
|
|
||||||
|
int nkeys = HASH_COUNT(pcpkey_hash) + HASH_COUNT(pcppubkey_hash);
|
||||||
|
|
||||||
|
if(nkeys > 0) {
|
||||||
|
printf("Key ID Type Creation Time Owner\n");
|
||||||
|
|
||||||
|
for(k=pcpkey_hash; k != NULL; k=(pcp_key_t*)(k->hh.next)) {
|
||||||
|
pcpkey_printlineinfo(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *p;
|
||||||
|
for(p=pcppubkey_hash; p != NULL; p=(pcp_pubkey_t*)(p->hh.next)) {
|
||||||
|
pcppubkey_printlineinfo(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("The key vault file %s doesn't contain any keys so far.\n", vault->filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *pcp_normalize_id(char *keyid) {
|
||||||
|
char *id = ucmalloc(17);
|
||||||
|
int len = strnlen(keyid, 24);
|
||||||
|
|
||||||
|
if(len == 16) {
|
||||||
|
memcpy(id, keyid, 17);
|
||||||
|
}
|
||||||
|
else if(len < 16) {
|
||||||
|
fatal("Specified key id %s is too short!\n", keyid);
|
||||||
|
free(id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if(len > 18) {
|
||||||
|
fatal("Specified key id %s is too long!\n", keyid);
|
||||||
|
free(id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(keyid[0] == '0' && keyid[1] == 'x' && len == 18) {
|
||||||
|
int i;
|
||||||
|
for(i=0; i<16; ++i) {
|
||||||
|
id[i] = keyid[i+2];
|
||||||
|
}
|
||||||
|
id[16] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("Specified key id %s is too long!\n", keyid);
|
||||||
|
free(id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *pcp_find_primary_secret() {
|
||||||
|
pcp_key_t *key = NULL;
|
||||||
|
pcp_key_t *k;
|
||||||
|
for(k=pcpkey_hash; k != NULL; k=(pcp_key_t*)(k->hh.next)) {
|
||||||
|
if(k->type == PCP_KEY_TYPE_MAINSECRET) {
|
||||||
|
key = ucmalloc(sizeof(pcp_key_t));
|
||||||
|
memcpy(key, k, sizeof(pcp_key_t));
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no primary? whoops
|
||||||
|
int nkeys = HASH_COUNT(pcpkey_hash);
|
||||||
|
if(nkeys == 1) {
|
||||||
|
for(k=pcpkey_hash; k != NULL; k=(pcp_key_t*)(k->hh.next)) {
|
||||||
|
key = ucmalloc(sizeof(pcp_key_t));
|
||||||
|
memcpy(key, k, sizeof(pcp_key_t));
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcp_exportsecret(char *keyid, int useid, char *outfile) {
|
||||||
|
pcp_key_t *key = NULL;
|
||||||
|
|
||||||
|
if(useid == 1) {
|
||||||
|
// look if we've got that one
|
||||||
|
HASH_FIND_STR(pcpkey_hash, keyid, key);
|
||||||
|
if(key == NULL) {
|
||||||
|
fatal("Could not find a secret key with id 0x%s in vault %s!\n", keyid, vault->filename);
|
||||||
|
free(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// look for our primary key
|
||||||
|
key = pcp_find_primary_secret();
|
||||||
|
if(key == NULL) {
|
||||||
|
fatal("There's no primary secret key in the vault %s!\n", vault->filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
FILE *out;
|
||||||
|
if(outfile == NULL) {
|
||||||
|
out = stdout;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not create output file %s", outfile);
|
||||||
|
out = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(out != NULL) {
|
||||||
|
if(debug)
|
||||||
|
pcp_dumpkey(key);
|
||||||
|
else
|
||||||
|
pcpkey_print(key, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_exportpublic(char *keyid, int useid, char *outfile) {
|
||||||
|
pcp_pubkey_t *key = NULL;
|
||||||
|
|
||||||
|
if(useid == 1) {
|
||||||
|
// look if we've got that one
|
||||||
|
HASH_FIND_STR(pcppubkey_hash, keyid, key);
|
||||||
|
if(key == NULL) {
|
||||||
|
// maybe it's a secret key?
|
||||||
|
pcp_key_t *s = NULL;
|
||||||
|
HASH_FIND_STR(pcpkey_hash, keyid, s);
|
||||||
|
if(s == NULL) {
|
||||||
|
fatal("Could not find a public key with id 0x%s in vault %s!\n", keyid, vault->filename);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
key = pcpkey_pub_from_secret(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// look for the primary secret
|
||||||
|
pcp_key_t *s = NULL;
|
||||||
|
s = pcp_find_primary_secret();
|
||||||
|
if(s == NULL) {
|
||||||
|
fatal("There's no primary secret key in the vault %s!\n", vault->filename);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
key = pcpkey_pub_from_secret(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
FILE *out;
|
||||||
|
if(outfile == NULL) {
|
||||||
|
out = stdout;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not create output file %s", outfile);
|
||||||
|
out = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(out != NULL) {
|
||||||
|
pcppubkey_print(key, out);
|
||||||
|
fprintf(stderr, "public key exported.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int pcp_importsecret (vault_t *vault, FILE *in) {
|
||||||
|
size_t clen;
|
||||||
|
char *z85 = pcp_readz85file(in);
|
||||||
|
|
||||||
|
if(z85 == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
unsigned char *z85decoded = pcp_z85_decode((char *)z85, &clen);
|
||||||
|
free(z85);
|
||||||
|
|
||||||
|
if(z85decoded == NULL) {
|
||||||
|
fatal("Error: could not decode input - it's probably not Z85.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(clen != sizeof(pcp_key_t)) {
|
||||||
|
fatal("Error: decoded input didn't result to a proper sized key! (got %d bytes)\n", clen);
|
||||||
|
free(z85decoded);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// all good now
|
||||||
|
pcp_key_t *key = (pcp_key_t *)z85decoded;
|
||||||
|
if(debug)
|
||||||
|
pcp_dumpkey(key);
|
||||||
|
|
||||||
|
if(pcp_sanitycheck_key(key) == 0) {
|
||||||
|
if(key->secret[0] != 0) {
|
||||||
|
// unencrypted, encrypt it
|
||||||
|
fprintf(stderr, "Key to be imported is unencrypted.\n");
|
||||||
|
char *passphrase;
|
||||||
|
pcp_readpass(&passphrase, "Enter passphrase for key encryption", NULL, 1);
|
||||||
|
key = pcpkey_encrypt(key, passphrase);
|
||||||
|
}
|
||||||
|
int nkeys = HASH_COUNT(pcpkey_hash);
|
||||||
|
if(nkeys == 0)
|
||||||
|
key->type = PCP_KEY_TYPE_MAINSECRET;
|
||||||
|
|
||||||
|
if(pcpvault_additem(vault, (void *)key, sizeof(pcp_key_t),
|
||||||
|
PCP_KEY_TYPE_SECRET, 1) == 0) {
|
||||||
|
fprintf(stderr, "key 0x%s added to %s.\n", key->id, vault->filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pcp_importpublic (vault_t *vault, FILE *in) {
|
||||||
|
size_t clen;
|
||||||
|
char *z85 = pcp_readz85file(in);
|
||||||
|
|
||||||
|
if(z85 == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
unsigned char *z85decoded = pcp_z85_decode((char *)z85, &clen);
|
||||||
|
free(z85);
|
||||||
|
|
||||||
|
if(z85decoded == NULL) {
|
||||||
|
fatal("Error: could not decode input - it's probably not Z85 (got %d bytes)\n", clen);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(clen != sizeof(pcp_pubkey_t)) {
|
||||||
|
fatal("Error: decoded input didn't result to a proper sized key!\n", clen);
|
||||||
|
free(z85decoded);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// all good now
|
||||||
|
pcp_pubkey_t *pub = (pcp_pubkey_t *)z85decoded;
|
||||||
|
if(debug)
|
||||||
|
pcp_dumppubkey(pub);
|
||||||
|
if(pcp_sanitycheck_pub(pub) == 0) {
|
||||||
|
if(pcpvault_additem(vault, (void *)pub, sizeof(pcp_pubkey_t), PCP_KEY_TYPE_PUBLIC, 1) == 0) {
|
||||||
|
fprintf(stderr, "key 0x%s added to %s.\n", pub->id, vault->filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcp_sanitycheck_pub(pcp_pubkey_t *key) {
|
||||||
|
if(key->public[0] == 0) {
|
||||||
|
fatal("Pubkey sanity check: public key contained in key seems to be empty!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->type != PCP_KEY_TYPE_PUBLIC) {
|
||||||
|
fatal("Pubkey sanity check: key type is not PUBLIC (expected: %02x, got: %02x)!\n",
|
||||||
|
PCP_KEY_TYPE_PUBLIC, key->type);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->version != PCP_KEY_VERSION) {
|
||||||
|
fatal("Pubkey sanity check: unknown key version (expected: %08X, got: %08X)!\n",
|
||||||
|
PCP_KEY_VERSION, key->version);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->serial <= 0) {
|
||||||
|
fatal("Pubkey sanity check: invalid serial number: %08X!\n", key->serial);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->id[16] != '\0') {
|
||||||
|
char *got = ucmalloc(17);
|
||||||
|
memcpy(got, key->id, 17);
|
||||||
|
got[16] = '\0';
|
||||||
|
fatal("Pubkey sanity check: invalid key id (expected 16 bytes, got: %s)!\n", got);
|
||||||
|
free(got);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
if(c->tm_year <= 0 || c->tm_year > 1100) {
|
||||||
|
// well, I'm perhaps overacting here :)
|
||||||
|
fatal("Pubkey sanity check: invalid creation timestamp (got year %04d)!\n", c->tm_year + 1900);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_pubkey_t *maybe = pcppubkey_exists(key->id);
|
||||||
|
if(maybe != NULL) {
|
||||||
|
fatal("Pubkey sanity check: there already exists a key with the id 0x%s\n", key->id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pcp_sanitycheck_key(pcp_key_t *key) {
|
||||||
|
if(key->encrypted[0] == 0) {
|
||||||
|
fatal("Secretkey sanity check: secret key contained in key seems to be empty!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->type != PCP_KEY_TYPE_SECRET && key->type != PCP_KEY_TYPE_MAINSECRET) {
|
||||||
|
fatal("Secretkey sanity check: key type is not SECRET (expected: %02x, got: %02x)!\n",
|
||||||
|
PCP_KEY_TYPE_SECRET, key->type);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->version != PCP_KEY_VERSION) {
|
||||||
|
fatal("Secretkey sanity check: unknown key version (expected: %08X, got: %08X)!\n",
|
||||||
|
PCP_KEY_VERSION, key->version);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->serial <= 0) {
|
||||||
|
fatal("Secretkey sanity check: invalid serial number: %08X!\n", key->serial);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key->id[16] != '\0') {
|
||||||
|
char *got = ucmalloc(17);
|
||||||
|
memcpy(got, key->id, 17);
|
||||||
|
got[16] = '\0';
|
||||||
|
fatal("Secretkey sanity check: invalid key id (expected 16 bytes, got: %s)!\n", got);
|
||||||
|
free(got);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
if(c->tm_year <= 0 || c->tm_year > 1100) {
|
||||||
|
// well, I'm perhaps overacting here :)
|
||||||
|
fatal("Secretkey sanity check: invalid creation timestamp (got year %04d)!\n", c->tm_year + 1900);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcp_key_t *maybe = pcpkey_exists(key->id);
|
||||||
|
if(maybe != NULL) {
|
||||||
|
fatal("Secretkey sanity check: there already exists a key with the id 0x%s\n", key->id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpdelete_key(char *keyid) {
|
||||||
|
pcp_pubkey_t *p = pcppubkey_exists(keyid);
|
||||||
|
|
||||||
|
if(p != NULL) {
|
||||||
|
// delete public
|
||||||
|
HASH_DEL(pcppubkey_hash, p);
|
||||||
|
free(p);
|
||||||
|
vault->unsafed = 1;
|
||||||
|
fprintf(stderr, "Public key deleted.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcp_key_t *s = pcpkey_exists(keyid);
|
||||||
|
if(s != NULL) {
|
||||||
|
// delete secret
|
||||||
|
HASH_DEL(pcpkey_hash, s);
|
||||||
|
free(s);
|
||||||
|
vault->unsafed = 1;
|
||||||
|
fprintf(stderr, "Secret key deleted.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("No key with id 0x%s found!\n", keyid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpedit_key(char *keyid) {
|
||||||
|
pcp_key_t *key = pcpkey_exists(keyid);
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
if(key->secret[0] == 0) {
|
||||||
|
char *passphrase;
|
||||||
|
pcp_readpass(&passphrase, "Enter passphrase to decrypt the key", NULL, 1);
|
||||||
|
key = pcpkey_decrypt(key, passphrase);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
char *owner = pcp_getstdin("Enter the name of the key owner");
|
||||||
|
memcpy(key->owner, owner, strlen(owner) + 1);
|
||||||
|
|
||||||
|
char *mail = pcp_getstdin("Enter the email address of the key owner");
|
||||||
|
memcpy(key->mail, mail, strlen(mail) + 1);
|
||||||
|
|
||||||
|
char *passphrase;
|
||||||
|
pcp_readpass(&passphrase, "Enter passphrase for key encryption", NULL, 1);
|
||||||
|
key = pcpkey_encrypt(key, passphrase);
|
||||||
|
|
||||||
|
if(key != NULL) {
|
||||||
|
if(debug)
|
||||||
|
pcp_dumpkey(key);
|
||||||
|
|
||||||
|
vault->unsafed = 1; // will be safed automatically
|
||||||
|
fprintf(stderr, "Key key changed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("No key with id 0x%s found!\n", keyid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
35
src/keymgmt.h
Normal file
35
src/keymgmt.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#ifndef _HAVE_KEYMGMT_H
|
||||||
|
#define _HAVE_KEYMGMT_H
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "randomart.h"
|
||||||
|
#include "mac.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "pcp.h"
|
||||||
|
#include "vault.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "readpass.h"
|
||||||
|
#include "keyprint.h"
|
||||||
|
|
||||||
|
#define _WITH_GETLINE
|
||||||
|
|
||||||
|
char *pcp_getstdin(const char *prompt);
|
||||||
|
int pcp_storekey (pcp_key_t *key);
|
||||||
|
void pcp_keygen();
|
||||||
|
void pcp_listkeys();
|
||||||
|
void pcp_exportsecret(char *keyid, int useid, char *outfile);
|
||||||
|
void pcp_exportpublic(char *keyid, int useid, char *outfile);
|
||||||
|
char *pcp_normalize_id(char *keyid);
|
||||||
|
pcp_key_t *pcp_find_primary_secret();
|
||||||
|
int pcp_importpublic (vault_t *vault, FILE *in);
|
||||||
|
int pcp_sanitycheck_pub(pcp_pubkey_t *key);
|
||||||
|
int pcp_importsecret (vault_t *vault, FILE *in);
|
||||||
|
int pcp_sanitycheck_key(pcp_key_t *key);
|
||||||
|
void pcpdelete_key(char *keyid);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _HAVE_KEYMGMT_H
|
||||||
250
src/keyprint.c
Normal file
250
src/keyprint.c
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
#include "keyprint.h"
|
||||||
|
|
||||||
|
|
||||||
|
void pcptext_key(char *keyid) {
|
||||||
|
pcp_key_t *s = pcpkey_exists(keyid);
|
||||||
|
if(s != NULL) {
|
||||||
|
pcpkey_print(s, stdout);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcp_pubkey_t *p = pcppubkey_exists(keyid);
|
||||||
|
if(p != NULL) {
|
||||||
|
pcppubkey_print(p, stdout);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("No key with id 0x%s found!\n", keyid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcptext_vault(vault_t *vault) {
|
||||||
|
printf(" Key vault: %s\n", vault->filename);
|
||||||
|
printf("Vault version: %08X\n", vault->version);
|
||||||
|
printf(" Checksum: ");
|
||||||
|
|
||||||
|
int i;
|
||||||
|
unsigned char *hash = vault->checksum;
|
||||||
|
for ( i = 0;i <15 ;++i) printf("%02X:",(unsigned int) hash[i]);
|
||||||
|
printf("%02X", hash[15]);
|
||||||
|
printf("\n ");
|
||||||
|
for ( i = 16;i <31 ;++i) printf("%02X:",(unsigned int) hash[i]);
|
||||||
|
printf("%02X", hash[31]);
|
||||||
|
printf("\n");
|
||||||
|
free(hash);
|
||||||
|
|
||||||
|
printf(" Secret keys: %d\n", HASH_COUNT(pcpkey_hash));
|
||||||
|
printf(" Public keys: %d\n", HASH_COUNT(pcppubkey_hash));
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpkey_printlineinfo(pcp_key_t *key) {
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
printf("0x%s %s %04d-%02d-%02dT%02d:%02d:%02d %s <%s>\n",
|
||||||
|
key->id,
|
||||||
|
(key->type == PCP_KEY_TYPE_MAINSECRET) ? "primary" : " secret",
|
||||||
|
c->tm_year+1900, c->tm_mon+1, c->tm_mday,
|
||||||
|
c->tm_hour, c->tm_min, c->tm_sec,
|
||||||
|
key->owner, key->mail);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcppubkey_printlineinfo(pcp_pubkey_t *key) {
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
printf("0x%s public %04d-%02d-%02dT%02d:%02d:%02d %s <%s>\n",
|
||||||
|
key->id,
|
||||||
|
c->tm_year+1900, c->tm_mon+1, c->tm_mday,
|
||||||
|
c->tm_hour, c->tm_min, c->tm_sec,
|
||||||
|
key->owner, key->mail);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcpkey_print(pcp_key_t *key, FILE* out) {
|
||||||
|
size_t zlen;
|
||||||
|
char *z85encoded = pcp_z85_encode((unsigned char*)key, sizeof(pcp_key_t), &zlen);
|
||||||
|
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
|
||||||
|
fprintf(out, "%s\n", PCP_KEY_HEADER);
|
||||||
|
|
||||||
|
fprintf(out, " Generated by: %s Version %d.%d.%d\n",
|
||||||
|
PCP_ME, PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH);
|
||||||
|
|
||||||
|
fprintf(out, " Cipher: %s\n", PCP_KEY_PRIMITIVE);
|
||||||
|
|
||||||
|
fprintf(out, " Key-ID: 0x%s\n", key->id);
|
||||||
|
|
||||||
|
//2004-06-14T23:34:30.
|
||||||
|
fprintf(out, " Creation Time: %04d-%02d-%02dT%02d:%02d:%02d\n",
|
||||||
|
c->tm_year+1900, c->tm_mon+1, c->tm_mday,
|
||||||
|
c->tm_hour, c->tm_min, c->tm_sec);
|
||||||
|
|
||||||
|
fprintf(out, " Serial Number: 0x%08X\n", key->serial);
|
||||||
|
fprintf(out, " Key Version: 0x%08X\n", key->version);
|
||||||
|
|
||||||
|
fprintf(out, "\n%s\n", z85encoded);
|
||||||
|
|
||||||
|
fprintf(out, "%s\n", PCP_KEY_FOOTER);
|
||||||
|
|
||||||
|
free(z85encoded);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcppubkey_print(pcp_pubkey_t *key, FILE* out) {
|
||||||
|
size_t zlen;
|
||||||
|
char *z85encoded = pcp_z85_encode((unsigned char*)key, sizeof(pcp_pubkey_t), &zlen);
|
||||||
|
|
||||||
|
struct tm *c;
|
||||||
|
time_t t = (time_t)key->ctime;
|
||||||
|
c = localtime(&t);
|
||||||
|
|
||||||
|
fprintf(out, "%s\n", PCP_PUBKEY_HEADER);
|
||||||
|
|
||||||
|
fprintf(out, " Generated by: %s Version %d.%d.%d\n",
|
||||||
|
PCP_ME, PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH);
|
||||||
|
|
||||||
|
fprintf(out, " Cipher: %s\n", PCP_KEY_PRIMITIVE);
|
||||||
|
|
||||||
|
fprintf(out, " Owner: %s\n", key->owner);
|
||||||
|
fprintf(out, " Mail: %s\n", key->mail);
|
||||||
|
|
||||||
|
fprintf(out, " Key-ID: 0x%s\n", key->id);
|
||||||
|
fprintf(out, " Public-Key: %s\n", pcp_z85_encode(key->public, 32, &zlen));
|
||||||
|
|
||||||
|
//2004-06-14T23:34:30.
|
||||||
|
fprintf(out, " Creation Time: %04d-%02d-%02dT%02d:%02d:%02d\n",
|
||||||
|
c->tm_year+1900, c->tm_mon+1, c->tm_mday,
|
||||||
|
c->tm_hour, c->tm_min, c->tm_sec);
|
||||||
|
|
||||||
|
unsigned char *hash = pcppubkey_getchecksum(key);
|
||||||
|
fprintf(out, " Checksum: ");
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for ( i = 0;i <15 ;++i) fprintf(out, "%02X:",(unsigned int) hash[i]);
|
||||||
|
fprintf(out, "%02X", hash[15]);
|
||||||
|
fprintf(out, "\n ");
|
||||||
|
for ( i = 16;i <31 ;++i) fprintf(out, "%02X:",(unsigned int) hash[i]);
|
||||||
|
fprintf(out, "%02X", hash[31]);
|
||||||
|
fprintf(out, "\n");
|
||||||
|
fprintf(out, " Serial Number: 0x%08X\n", key->serial);
|
||||||
|
fprintf(out, " Key Version: 0x%08X\n", key->version);
|
||||||
|
|
||||||
|
char *r = pcppubkey_get_art(key);
|
||||||
|
fprintf(out, " Random Art ID: ");
|
||||||
|
for (i=0; i<strlen(r); ++i) {
|
||||||
|
if(r[i] == '\n') {
|
||||||
|
fprintf(out, "\n ");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(out, "%c", r[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(out, "\n");
|
||||||
|
|
||||||
|
fprintf(out, "\n%s\n", z85encoded);
|
||||||
|
|
||||||
|
fprintf(out, "%s\n", PCP_PUBKEY_FOOTER);
|
||||||
|
|
||||||
|
free(hash);
|
||||||
|
free(r);
|
||||||
|
free(z85encoded);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_dumpkey(pcp_key_t *k) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("Dumping pcp_key_t raw values:\n");
|
||||||
|
printf(" public: ");
|
||||||
|
for ( i = 0;i < 32;++i) printf("%02x",(unsigned int) k->public[i]);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf(" secret: ");
|
||||||
|
for ( i = 0;i < 32;++i) printf("%02x",(unsigned int) k->secret[i]);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf(" nonce: ");
|
||||||
|
for ( i = 0;i < 24;++i) printf("%02x",(unsigned int) k->nonce[i]);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("encrypted: ");
|
||||||
|
for ( i = 0;i < 48;++i) printf("%02x",(unsigned int) k->encrypted[i]);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf(" owner: %s\n", k->owner);
|
||||||
|
|
||||||
|
printf(" mail: %s\n", k->mail);
|
||||||
|
|
||||||
|
printf(" id: %s\n", k->id);
|
||||||
|
|
||||||
|
printf(" ctime: %ld\n", k->ctime);
|
||||||
|
|
||||||
|
printf(" version: 0x%08X\n", k->version);
|
||||||
|
|
||||||
|
printf(" serial: 0x%08X\n", k->serial);
|
||||||
|
|
||||||
|
printf(" type: 0x%02X\n", k->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pcp_dumppubkey(pcp_pubkey_t *k) {
|
||||||
|
int i;
|
||||||
|
printf("Dumping pcp_pubkey_t raw values:\n");
|
||||||
|
printf(" public: ");
|
||||||
|
for ( i = 0;i < 32;++i) printf("%02x",(unsigned int) k->public[i]);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf(" owner: %s\n", k->owner);
|
||||||
|
|
||||||
|
printf(" mail: %s\n", k->mail);
|
||||||
|
|
||||||
|
printf(" id: %s\n", k->id);
|
||||||
|
|
||||||
|
printf(" ctime: %ld\n", k->ctime);
|
||||||
|
|
||||||
|
printf(" version: 0x%08X\n", k->version);
|
||||||
|
|
||||||
|
printf(" serial: 0x%08X\n", k->serial);
|
||||||
|
|
||||||
|
printf(" type: 0x%02X\n", k->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcpkey_printshortinfo(pcp_key_t *key) {
|
||||||
|
int i;
|
||||||
|
printf(" Key-ID: 0x%s\n", key->id);
|
||||||
|
printf(" Owner: %s\n", key->owner);
|
||||||
|
char *r = pcpkey_get_art(key);
|
||||||
|
printf(" Random Art ID: ");
|
||||||
|
for (i=0; i<strlen(r); ++i) {
|
||||||
|
if(r[i] == '\n') {
|
||||||
|
printf("\n ");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("%c", r[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcppubkey_printshortinfo(pcp_pubkey_t *key) {
|
||||||
|
int i;
|
||||||
|
printf(" Key-ID: 0x%s\n", key->id);
|
||||||
|
printf(" Owner: %s\n", key->owner);
|
||||||
|
char *r = pcpkey_get_art(key);
|
||||||
|
printf(" Random Art ID: ");
|
||||||
|
for (i=0; i<strlen(r); ++i) {
|
||||||
|
if(r[i] == '\n') {
|
||||||
|
printf("\n ");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("%c", r[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
23
src/keyprint.h
Normal file
23
src/keyprint.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef _HAVE_PCP_KEYPRINT_H
|
||||||
|
#define _HAVE_PCP_KEYPRINT_H
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "vault.h"
|
||||||
|
|
||||||
|
void pcp_dumpkey(pcp_key_t *k);
|
||||||
|
void pcp_dumppubkey(pcp_pubkey_t *k);
|
||||||
|
|
||||||
|
void pcpkey_print(pcp_key_t *key, FILE *out);
|
||||||
|
void pcppubkey_print(pcp_pubkey_t *key, FILE *out);
|
||||||
|
|
||||||
|
void pcpkey_printshortinfo(pcp_key_t *key);
|
||||||
|
void pcppubkey_printshortinfo(pcp_pubkey_t *key);
|
||||||
|
|
||||||
|
void pcpkey_printlineinfo(pcp_key_t *key);
|
||||||
|
void pcppubkey_printlineinfo(pcp_pubkey_t *key);
|
||||||
|
|
||||||
|
void pcptext_key(char *keyid);
|
||||||
|
void pcptext_vault(vault_t *vault);
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_KEYPRINT_H
|
||||||
339
src/pcp.c
Normal file
339
src/pcp.c
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
#include "pcp.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
void usage() {
|
||||||
|
fprintf(stderr, PCP_HELP_INTRO);
|
||||||
|
fprintf(stderr, PCP_HELP);
|
||||||
|
version();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void version() {
|
||||||
|
fprintf(stderr, "pcp version %d.%d.%d\n",
|
||||||
|
PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *default_vault() {
|
||||||
|
char *path = ucmalloc(1024);;
|
||||||
|
snprintf(path, 1024, "%s/.pcpvault", getenv("HOME"));
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv) {
|
||||||
|
int opt, mode, usevault, useid;
|
||||||
|
char *vaultfile = default_vault();
|
||||||
|
char *outfile = NULL;
|
||||||
|
char *infile = NULL;
|
||||||
|
char *keyid = NULL;
|
||||||
|
char *id = NULL;
|
||||||
|
char *xpass = NULL;
|
||||||
|
FILE *in;
|
||||||
|
|
||||||
|
PCP_EXIT = 0;
|
||||||
|
errno = 0;
|
||||||
|
debug = 0;
|
||||||
|
mode = 0;
|
||||||
|
usevault = 0;
|
||||||
|
useid = 0;
|
||||||
|
|
||||||
|
static struct option longopts[] = {
|
||||||
|
// generics
|
||||||
|
{ "vault", required_argument, NULL, 'V' },
|
||||||
|
{ "outfile", required_argument, NULL, 'O' },
|
||||||
|
{ "infile", required_argument, NULL, 'I' },
|
||||||
|
{ "keyid", required_argument, NULL, 'i' },
|
||||||
|
{ "text", required_argument, NULL, 't' },
|
||||||
|
{ "xpass", required_argument, NULL, 'x' },
|
||||||
|
|
||||||
|
// key management
|
||||||
|
{ "keygen", no_argument, NULL, 'k' },
|
||||||
|
{ "listkeys", no_argument, NULL, 'l' },
|
||||||
|
{ "export-secret", no_argument, NULL, 's' },
|
||||||
|
{ "export-public", no_argument, NULL, 'p' },
|
||||||
|
{ "import-secret", no_argument, NULL, 'S' },
|
||||||
|
{ "import-public", no_argument, NULL, 'P' },
|
||||||
|
{ "remove-key", no_argument, NULL, 'r' },
|
||||||
|
{ "edit-key", no_argument, NULL, 'E' },
|
||||||
|
|
||||||
|
// crypto
|
||||||
|
{ "encrypt", no_argument, NULL, 'e' },
|
||||||
|
{ "decrypt", no_argument, NULL, 'd' },
|
||||||
|
|
||||||
|
// encoding
|
||||||
|
{ "z85-encode", no_argument, NULL, 'z' },
|
||||||
|
{ "z85-decode", no_argument, NULL, 'Z' },
|
||||||
|
|
||||||
|
// globals
|
||||||
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
{ "version", no_argument, NULL, 'f' },
|
||||||
|
{ "debug", no_argument, NULL, 'D' },
|
||||||
|
{ NULL, 0, NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
while ((opt = getopt_long(argc, argv, "klV:vdehsO:i:I:pSPrtEx:DzZ",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
|
||||||
|
switch (opt) {
|
||||||
|
|
||||||
|
case 'k':
|
||||||
|
mode += PCP_MODE_KEYGEN;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
mode += PCP_MODE_LISTKEYS;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
mode += PCP_MODE_EXPORT_SECRET;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
mode += PCP_MODE_EXPORT_PUBLIC;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
mode += PCP_MODE_IMPORT_PUBLIC;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
mode += PCP_MODE_IMPORT_SECRET;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
mode += PCP_MODE_DELETE_KEY;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
mode += PCP_MODE_TEXT;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
mode += PCP_MODE_EDIT;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
mode += PCP_MODE_ENCRYPT;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
mode += PCP_MODE_DECRYPT;
|
||||||
|
usevault = 1;
|
||||||
|
break;
|
||||||
|
case 'z':
|
||||||
|
mode += PCP_MODE_ZENCODE;
|
||||||
|
break;
|
||||||
|
case 'Z':
|
||||||
|
mode += PCP_MODE_ZDECODE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 'V':
|
||||||
|
strncpy(vaultfile, optarg, 1024);
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
outfile = ucmalloc(strlen(optarg)+1);
|
||||||
|
strncpy(outfile, optarg, strlen(optarg)+1);
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
infile = ucmalloc(strlen(optarg)+1);
|
||||||
|
strncpy(infile, optarg, strlen(optarg)+1);
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
keyid = ucmalloc(19);
|
||||||
|
strncpy(keyid, optarg, 19);
|
||||||
|
useid = 1;
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
xpass = ucmalloc(strlen(optarg)+1);
|
||||||
|
strncpy(xpass, optarg, strlen(optarg)+1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
debug = 1;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
version();
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
|
||||||
|
if(usevault == 1) {
|
||||||
|
pcp_inithashes();
|
||||||
|
vault = pcpvault_init(vaultfile);
|
||||||
|
if(vault != NULL) {
|
||||||
|
switch (mode) {
|
||||||
|
case PCP_MODE_KEYGEN:
|
||||||
|
pcp_keygen(xpass);
|
||||||
|
if(xpass != NULL)
|
||||||
|
free(xpass);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_LISTKEYS:
|
||||||
|
pcp_listkeys();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_EXPORT_SECRET:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcp_exportsecret(id, useid, outfile);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcp_exportsecret(NULL, useid, outfile);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_EXPORT_PUBLIC:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcp_exportpublic(id, useid, outfile);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcp_exportpublic(NULL, useid, outfile);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_IMPORT_PUBLIC:
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
free(infile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcp_importpublic(vault, in);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_IMPORT_SECRET:
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
free(infile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcp_importsecret(vault, in);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_DELETE_KEY:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcpdelete_key(id);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("You need to specify a key id (--keyid)!\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_TEXT:
|
||||||
|
if(! useid) {
|
||||||
|
pcptext_vault(vault);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcptext_key(id);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_EDIT:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcpedit_key(id);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("You need to specify a key id (--keyid)!\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_ENCRYPT:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcpencrypt(id, infile, outfile, xpass);
|
||||||
|
free(id);
|
||||||
|
if(xpass != NULL)
|
||||||
|
free(xpass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fatal("You need to specify a key id (--keyid)!\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_DECRYPT:
|
||||||
|
if(useid) {
|
||||||
|
id = pcp_normalize_id(keyid);
|
||||||
|
if(id != NULL) {
|
||||||
|
pcpdecrypt(id, useid, infile, outfile, xpass);
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pcpdecrypt(NULL, useid, infile, outfile, xpass);
|
||||||
|
}
|
||||||
|
if(xpass != NULL)
|
||||||
|
free(xpass);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//
|
||||||
|
goto ELSEMODE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcpvault_close(vault);
|
||||||
|
pcp_cleanhashes();
|
||||||
|
ucfree(vaultfile);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ELSEMODE:
|
||||||
|
switch (mode) {
|
||||||
|
case PCP_MODE_ZENCODE:
|
||||||
|
pcpz85_encode(infile, outfile);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCP_MODE_ZDECODE:
|
||||||
|
pcpz85_decode(infile, outfile);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// mode params mixed
|
||||||
|
fatal("Sorry, invalid combinatin of commandline parameters!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fatals_ifany();
|
||||||
|
return PCP_EXIT;
|
||||||
|
|
||||||
|
}
|
||||||
64
src/pcp.h
Normal file
64
src/pcp.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#ifndef _HAVE_PCP_H
|
||||||
|
#define _HAVE_PCP_H
|
||||||
|
|
||||||
|
#define _BSD_SOURCE
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
// lib
|
||||||
|
#include "mem.h"
|
||||||
|
#include "z85.h"
|
||||||
|
#include "zmq_z85.h"
|
||||||
|
#include "z85util.h"
|
||||||
|
#include "version.h"
|
||||||
|
#include "vault.h"
|
||||||
|
|
||||||
|
// subs
|
||||||
|
#include "keymgmt.h"
|
||||||
|
#include "usage.h"
|
||||||
|
#include "encryption.h"
|
||||||
|
|
||||||
|
// operation modi
|
||||||
|
// perl -e '$x=0; while ($x<100000) { $x++; $x *= 1.7; printf "0x%08X: %d\n", $x, $x }'
|
||||||
|
#define PCP_MODE_KEYGEN 0x00000001
|
||||||
|
#define PCP_MODE_LISTKEYS 0x00000004
|
||||||
|
#define PCP_MODE_EXPORT_SECRET 0x00000009
|
||||||
|
#define PCP_MODE_EXPORT_PUBLIC 0x00000011
|
||||||
|
#define PCP_MODE_IMPORT_SECRET 0x00000020
|
||||||
|
#define PCP_MODE_IMPORT_PUBLIC 0x00000038
|
||||||
|
#define PCP_MODE_DELETE_KEY 0x00000061
|
||||||
|
#define PCP_MODE_TEXT 0x000000A6
|
||||||
|
#define PCP_MODE_EDIT 0x0000011D
|
||||||
|
#define PCP_MODE_ENCRYPT 0x000001E7
|
||||||
|
#define PCP_MODE_DECRYPT 0x0000033D
|
||||||
|
#define PCP_MODE_ZENCODE 0x00000584
|
||||||
|
#define PCP_MODE_ZDECODE 0x00000962
|
||||||
|
|
||||||
|
/*
|
||||||
|
0x00000962
|
||||||
|
0x00000FF6
|
||||||
|
0x00001B25
|
||||||
|
0x00002E27
|
||||||
|
0x00004E77
|
||||||
|
0x00008566
|
||||||
|
0x0000E2CA
|
||||||
|
0x0001818C
|
||||||
|
0x00028F70
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PCP_HELP_INTRO \
|
||||||
|
"This is Pretty Curved Privacy. Licensed under the GPLv3. This\n"\
|
||||||
|
"is BETA software. Use with care. NOT intended for production\n"\
|
||||||
|
"use.\n"
|
||||||
|
|
||||||
|
vault_t *vault;
|
||||||
|
int debug;
|
||||||
|
|
||||||
|
void version();
|
||||||
|
void usage();
|
||||||
|
char *default_vault();
|
||||||
|
|
||||||
|
#endif // _HAVE_PCP_H
|
||||||
133
src/readpass.c
Normal file
133
src/readpass.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2009 Colin Percival
|
||||||
|
* 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "readpass.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||||
|
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||||
|
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||||
|
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||||
|
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||||
|
* terminal is being used) and repeat until the user enters the same password
|
||||||
|
* twice. Return the password as a malloced NUL-terminated string via
|
||||||
|
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||||
|
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
pcp_readpass(char ** passwd, const char * prompt,
|
||||||
|
const char * confirmprompt, int devtty)
|
||||||
|
{
|
||||||
|
FILE * readfrom;
|
||||||
|
char passbuf[MAXPASSLEN];
|
||||||
|
char confpassbuf[MAXPASSLEN];
|
||||||
|
struct termios term, term_old;
|
||||||
|
int usingtty;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If devtty != 0, try to open /dev/tty; if that fails, or if devtty
|
||||||
|
* is zero, we'll read the password from stdin instead.
|
||||||
|
*/
|
||||||
|
if ((devtty == 0) || ((readfrom = fopen("/dev/tty", "r")) == NULL))
|
||||||
|
readfrom = stdin;
|
||||||
|
|
||||||
|
/* If we're reading from a terminal, try to disable echo. */
|
||||||
|
if ((usingtty = isatty(fileno(readfrom))) != 0) {
|
||||||
|
if (tcgetattr(fileno(readfrom), &term_old)) {
|
||||||
|
fatal("Cannot read terminal settings");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
memcpy(&term, &term_old, sizeof(struct termios));
|
||||||
|
term.c_lflag = (term.c_lflag & ~ECHO) | ECHONL;
|
||||||
|
if (tcsetattr(fileno(readfrom), TCSANOW, &term)) {
|
||||||
|
fatal("Cannot set terminal settings");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retry:
|
||||||
|
/* If we have a terminal, prompt the user to enter the password. */
|
||||||
|
if (usingtty)
|
||||||
|
fprintf(stderr, "%s: ", prompt);
|
||||||
|
|
||||||
|
/* Read the password. */
|
||||||
|
if (fgets(passbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||||
|
fatal("Cannot read password");
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Confirm the password if necessary. */
|
||||||
|
if (confirmprompt != NULL) {
|
||||||
|
if (usingtty)
|
||||||
|
fprintf(stderr, "%s: ", confirmprompt);
|
||||||
|
if (fgets(confpassbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||||
|
fatal("Cannot read password");
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
if (strcmp(passbuf, confpassbuf)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Passwords mismatch, please try again\n");
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Terminate the string at the first "\r" or "\n" (if any). */
|
||||||
|
passbuf[strcspn(passbuf, "\r\n")] = '\0';
|
||||||
|
|
||||||
|
/* If we changed terminal settings, reset them. */
|
||||||
|
if (usingtty)
|
||||||
|
tcsetattr(fileno(readfrom), TCSANOW, &term_old);
|
||||||
|
|
||||||
|
/* Close /dev/tty if we opened it. */
|
||||||
|
if (readfrom != stdin)
|
||||||
|
fclose(readfrom);
|
||||||
|
|
||||||
|
/* Copy the password out. */
|
||||||
|
if ((*passwd = strdup(passbuf)) == NULL) {
|
||||||
|
fatal("Cannot allocate memory");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zero any stored passwords. */
|
||||||
|
memset(passbuf, 0, MAXPASSLEN);
|
||||||
|
memset(confpassbuf, 0, MAXPASSLEN);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err2:
|
||||||
|
/* Reset terminal settings if necessary. */
|
||||||
|
if (usingtty)
|
||||||
|
tcsetattr(fileno(readfrom), TCSAFLUSH, &term_old);
|
||||||
|
err1:
|
||||||
|
/* Close /dev/tty if we opened it. */
|
||||||
|
if (readfrom != stdin)
|
||||||
|
fclose(readfrom);
|
||||||
|
|
||||||
|
/* Failure! */
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
55
src/readpass.h
Normal file
55
src/readpass.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2009 Colin Percival
|
||||||
|
* 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. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file was originally written by Colin Percival as part of the Tarsnap
|
||||||
|
* online backup system.
|
||||||
|
*/
|
||||||
|
#ifndef _READPASS_H_
|
||||||
|
#define _READPASS_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
#define MAXPASSLEN 2048
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||||
|
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||||
|
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||||
|
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||||
|
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||||
|
* terminal is being used) and repeat until the user enters the same password
|
||||||
|
* twice. Return the password as a malloced NUL-terminated string via
|
||||||
|
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||||
|
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||||
|
*/
|
||||||
|
int pcp_readpass(char **, const char *, const char *, int);
|
||||||
|
|
||||||
|
#endif /* !_READPASS_H_ */
|
||||||
74
src/usage.h
Normal file
74
src/usage.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#ifndef _HAVE_USAGE_H
|
||||||
|
#define _HAVE_USAGE_H
|
||||||
|
#define PCP_HELP "\n" \
|
||||||
|
"Usage: pcp1 [options]\n" \
|
||||||
|
"\n" \
|
||||||
|
"General Options:\n" \
|
||||||
|
"-V --vault <vaultfile> Specify an alternate vault file.\n" \
|
||||||
|
" The deault vault is ~/.pcpvault.\n" \
|
||||||
|
"-O --outfile <file> Output file. If not specified, stdout\n" \
|
||||||
|
" will be used.\n" \
|
||||||
|
"-I --infile <file> Input file. If not specified, stdin\n" \
|
||||||
|
" will be used.\n" \
|
||||||
|
"-i --keyid <id> Specify a key id to import/export.\n" \
|
||||||
|
"-t --text Print textual representation of some\n" \
|
||||||
|
" item. Either -V or -i must be specified\n" \
|
||||||
|
" as well.\n" \
|
||||||
|
"-h --help Print this help message.\n" \
|
||||||
|
"-v --version Print program version.\n" \
|
||||||
|
"-D --debug Enable debug output.\n" \
|
||||||
|
"\n" \
|
||||||
|
"Keymanagement Options:\n" \
|
||||||
|
"-k --keygen Generate a CURVE25519 secret key. If\n" \
|
||||||
|
" the generated key is the first one in\n" \
|
||||||
|
" your vault, it will become the primary\n" \
|
||||||
|
" secret key.\n" \
|
||||||
|
"-l --listkeys List all keys currently stored in your\n" \
|
||||||
|
" vault. Only the key id's and some info\n" \
|
||||||
|
" about the keys will be printed, not the\n" \
|
||||||
|
" actual keys.\n" \
|
||||||
|
"-r --remove-key Remove a key from the vault. Requires\n" \
|
||||||
|
" option -i <keyid>.\n" \
|
||||||
|
"-s --export-secret Export a secret key. If your vault only\n" \
|
||||||
|
" contains one secret key, this one will\n" \
|
||||||
|
" be exported. If a key id have been\n" \
|
||||||
|
" specified (-i), this one will be used.\n" \
|
||||||
|
" If there are more than one secret keys\n" \
|
||||||
|
" in the vault and no key id has been\n" \
|
||||||
|
" given, export the primary secret key.\n" \
|
||||||
|
" Use -O to export to a file.\n" \
|
||||||
|
"-p --export-public Export a public key. If no key id have\n" \
|
||||||
|
" been specified, the public part of your\n" \
|
||||||
|
" primary secret key will be exported.\n" \
|
||||||
|
" Use -O to export to a file.\n" \
|
||||||
|
"-S --import-secret Import a secret key. Use -I to import\n" \
|
||||||
|
" from a file.\n" \
|
||||||
|
"-P --import-public Import a public key. Use -I to import\n" \
|
||||||
|
" from a file.\n" \
|
||||||
|
"\n" \
|
||||||
|
"Encryption Options:\n" \
|
||||||
|
"-e --encrypt Encrypt a message. Read from stdin or\n" \
|
||||||
|
" specified via -I. A keyid (-i) of the\n" \
|
||||||
|
" public key of the receipient must be\n" \
|
||||||
|
" specified. Output to stdout or written\n" \
|
||||||
|
" to the file specified via -O.\n" \
|
||||||
|
"-d --decrypt Decrypt a message. Read from stdin or\n" \
|
||||||
|
" specified via -I. Output to stdout or\n" \
|
||||||
|
" written to the file specified via -O.\n" \
|
||||||
|
" The primary secret key will be used for\n" \
|
||||||
|
" decryption, if there is no primary and\n" \
|
||||||
|
" just one secret key in the vault, this\n" \
|
||||||
|
" one will be used. Otherwise you'll have\n" \
|
||||||
|
" to specify the keyid (-i) of the key.\n" \
|
||||||
|
"\n" \
|
||||||
|
"Encoding Options:\n" \
|
||||||
|
"-z --z85-encode Encode something to Z85 encoding. Use\n" \
|
||||||
|
" -I and -O respectively, otherwise it\n" \
|
||||||
|
" stdin/stdout.\n" \
|
||||||
|
"-Z --z85-decode Decode something from Z85 encoding. Use\n" \
|
||||||
|
" -I and -O respectively, otherwise it\n" \
|
||||||
|
" stdin/stdout\n" \
|
||||||
|
"\n" \
|
||||||
|
"\n" \
|
||||||
|
"\n"
|
||||||
|
#endif
|
||||||
10
src/usage.sh
Executable file
10
src/usage.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
(echo "#ifndef _HAVE_USAGE_H"; echo "#define _HAVE_USAGE_H") > usage.h
|
||||||
|
|
||||||
|
echo -n "#define PCP_HELP " >> usage.h
|
||||||
|
|
||||||
|
cat usage.txt | sed -e 's/^/"/' -e 's/$/\\n" \\/' >> usage.h
|
||||||
|
|
||||||
|
echo "\"\\n\"" >> usage.h
|
||||||
|
echo "#endif" >> usage.h
|
||||||
70
src/usage.txt
Normal file
70
src/usage.txt
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
Usage: pcp1 [options]
|
||||||
|
|
||||||
|
General Options:
|
||||||
|
-V --vault <vaultfile> Specify an alternate vault file.
|
||||||
|
The deault vault is ~/.pcpvault.
|
||||||
|
-O --outfile <file> Output file. If not specified, stdout
|
||||||
|
will be used.
|
||||||
|
-I --infile <file> Input file. If not specified, stdin
|
||||||
|
will be used.
|
||||||
|
-i --keyid <id> Specify a key id to import/export.
|
||||||
|
-t --text Print textual representation of some
|
||||||
|
item. Either -V or -i must be specified
|
||||||
|
as well.
|
||||||
|
-h --help Print this help message.
|
||||||
|
-v --version Print program version.
|
||||||
|
-D --debug Enable debug output.
|
||||||
|
|
||||||
|
Keymanagement Options:
|
||||||
|
-k --keygen Generate a CURVE25519 secret key. If
|
||||||
|
the generated key is the first one in
|
||||||
|
your vault, it will become the primary
|
||||||
|
secret key.
|
||||||
|
-l --listkeys List all keys currently stored in your
|
||||||
|
vault. Only the key id's and some info
|
||||||
|
about the keys will be printed, not the
|
||||||
|
actual keys.
|
||||||
|
-r --remove-key Remove a key from the vault. Requires
|
||||||
|
option -i <keyid>.
|
||||||
|
-s --export-secret Export a secret key. If your vault only
|
||||||
|
contains one secret key, this one will
|
||||||
|
be exported. If a key id have been
|
||||||
|
specified (-i), this one will be used.
|
||||||
|
If there are more than one secret keys
|
||||||
|
in the vault and no key id has been
|
||||||
|
given, export the primary secret key.
|
||||||
|
Use -O to export to a file.
|
||||||
|
-p --export-public Export a public key. If no key id have
|
||||||
|
been specified, the public part of your
|
||||||
|
primary secret key will be exported.
|
||||||
|
Use -O to export to a file.
|
||||||
|
-S --import-secret Import a secret key. Use -I to import
|
||||||
|
from a file.
|
||||||
|
-P --import-public Import a public key. Use -I to import
|
||||||
|
from a file.
|
||||||
|
|
||||||
|
Encryption Options:
|
||||||
|
-e --encrypt Encrypt a message. Read from stdin or
|
||||||
|
specified via -I. A keyid (-i) of the
|
||||||
|
public key of the receipient must be
|
||||||
|
specified. Output to stdout or written
|
||||||
|
to the file specified via -O.
|
||||||
|
-d --decrypt Decrypt a message. Read from stdin or
|
||||||
|
specified via -I. Output to stdout or
|
||||||
|
written to the file specified via -O.
|
||||||
|
The primary secret key will be used for
|
||||||
|
decryption, if there is no primary and
|
||||||
|
just one secret key in the vault, this
|
||||||
|
one will be used. Otherwise you'll have
|
||||||
|
to specify the keyid (-i) of the key.
|
||||||
|
|
||||||
|
Encoding Options:
|
||||||
|
-z --z85-encode Encode something to Z85 encoding. Use
|
||||||
|
-I and -O respectively, otherwise it
|
||||||
|
stdin/stdout.
|
||||||
|
-Z --z85-decode Decode something from Z85 encoding. Use
|
||||||
|
-I and -O respectively, otherwise it
|
||||||
|
stdin/stdout
|
||||||
|
|
||||||
|
|
||||||
119
src/z85util.c
Normal file
119
src/z85util.c
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
#include "z85util.h"
|
||||||
|
|
||||||
|
int pcpz85_encode(char *infile, char *outfile) {
|
||||||
|
FILE *in;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
goto errz1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outfile == NULL)
|
||||||
|
out = stdout;
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not open output file %s\n", outfile);
|
||||||
|
goto errz1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *input = NULL;
|
||||||
|
size_t inputBufSize = 0;
|
||||||
|
unsigned char byte[1];
|
||||||
|
|
||||||
|
while(!feof(in)) {
|
||||||
|
if(!fread(&byte, 1, 1, in))
|
||||||
|
break;
|
||||||
|
unsigned char *tmp = realloc(input, inputBufSize + 1);
|
||||||
|
input = tmp;
|
||||||
|
memmove(&input[inputBufSize], byte, 1);
|
||||||
|
inputBufSize ++;
|
||||||
|
}
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
if(inputBufSize == 0) {
|
||||||
|
fatal("Input file is empty!\n");
|
||||||
|
goto errz2;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t zlen;
|
||||||
|
char *encoded = pcp_z85_encode(input, inputBufSize, &zlen);
|
||||||
|
|
||||||
|
if(encoded != NULL) {
|
||||||
|
fprintf(out, "%s\n%s\n%s\n", PCP_ZFILE_HEADER, encoded, PCP_ZFILE_FOOTER);
|
||||||
|
if(ferror(out) != 0) {
|
||||||
|
fatal("Failed to write z85 output!\n");
|
||||||
|
}
|
||||||
|
free(encoded);
|
||||||
|
goto errz2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
errz2:
|
||||||
|
free(input);
|
||||||
|
|
||||||
|
errz1:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int pcpz85_decode(char *infile, char *outfile) {
|
||||||
|
FILE *in;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
if(infile == NULL)
|
||||||
|
in = stdin;
|
||||||
|
else {
|
||||||
|
if((in = fopen(infile, "rb")) == NULL) {
|
||||||
|
fatal("Could not open input file %s\n", infile);
|
||||||
|
goto errdz1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outfile == NULL)
|
||||||
|
out = stdout;
|
||||||
|
else {
|
||||||
|
if((out = fopen(outfile, "wb+")) == NULL) {
|
||||||
|
fatal("Could not open output file %s\n", outfile);
|
||||||
|
goto errdz1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *encoded = pcp_readz85file(in);
|
||||||
|
|
||||||
|
if(encoded == NULL)
|
||||||
|
goto errdz1;
|
||||||
|
|
||||||
|
size_t clen;
|
||||||
|
unsigned char *decoded = pcp_z85_decode(encoded, &clen);
|
||||||
|
|
||||||
|
if(decoded == NULL)
|
||||||
|
goto errdz2;
|
||||||
|
|
||||||
|
fwrite(decoded, clen, 1, out);
|
||||||
|
fclose(out);
|
||||||
|
if(ferror(out) != 0) {
|
||||||
|
fatal("Failed to write decoded output!\n");
|
||||||
|
goto errdz3;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(decoded);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
errdz3:
|
||||||
|
free(decoded);
|
||||||
|
|
||||||
|
errdz2:
|
||||||
|
free(encoded);
|
||||||
|
|
||||||
|
errdz1:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
19
src/z85util.h
Normal file
19
src/z85util.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _HAVE_PCP_Z85
|
||||||
|
#define _HAVE_PCP_Z85
|
||||||
|
|
||||||
|
#define _BSD_SOURCE
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
#include "z85.h"
|
||||||
|
#include "zmq_z85.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
int pcpz85_encode(char *infile, char *outfile);
|
||||||
|
int pcpz85_decode(char *infile, char *outfile);
|
||||||
|
|
||||||
|
#endif
|
||||||
17
tests/Makefile.am
Normal file
17
tests/Makefile.am
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
check_PROGRAMS = col invalidkeys
|
||||||
|
|
||||||
|
col_LDADD = ../libpcp/.libs/libpcp1.a
|
||||||
|
col_SOURCES = collisions.c
|
||||||
|
|
||||||
|
invalidkeys_LDADD = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
|
||||||
|
invalidkeys_SOURCES = invalidkeys.c
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/src
|
||||||
|
|
||||||
|
|
||||||
|
test: check
|
||||||
|
./unittests.pl unittests.cfg
|
||||||
|
|
||||||
|
stresstest: check
|
||||||
|
./unittests.pl stresstests.cfg
|
||||||
529
tests/Makefile.in
Normal file
529
tests/Makefile.in
Normal file
@@ -0,0 +1,529 @@
|
|||||||
|
# Makefile.in generated by automake 1.12.4 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2012 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__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
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@
|
||||||
|
check_PROGRAMS = col$(EXEEXT) invalidkeys$(EXEEXT)
|
||||||
|
subdir = tests
|
||||||
|
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||||
|
$(top_srcdir)/config/depcomp
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
|
||||||
|
$(top_srcdir)/config/ltoptions.m4 \
|
||||||
|
$(top_srcdir)/config/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/config/ltversion.m4 \
|
||||||
|
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/libpcp/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am_col_OBJECTS = collisions.$(OBJEXT)
|
||||||
|
col_OBJECTS = $(am_col_OBJECTS)
|
||||||
|
col_DEPENDENCIES = ../libpcp/.libs/libpcp1.a
|
||||||
|
am_invalidkeys_OBJECTS = invalidkeys.$(OBJEXT)
|
||||||
|
invalidkeys_OBJECTS = $(am_invalidkeys_OBJECTS)
|
||||||
|
invalidkeys_DEPENDENCIES = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libpcp
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||||
|
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||||
|
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(col_SOURCES) $(invalidkeys_SOURCES)
|
||||||
|
DIST_SOURCES = $(col_SOURCES) $(invalidkeys_SOURCES)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
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@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
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@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
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@
|
||||||
|
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@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
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@
|
||||||
|
AM_CFLAGS = -I../libpcp -Wall -g
|
||||||
|
col_LDADD = ../libpcp/.libs/libpcp1.a
|
||||||
|
col_SOURCES = collisions.c
|
||||||
|
invalidkeys_LDADD = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
|
||||||
|
invalidkeys_SOURCES = invalidkeys.c
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/src
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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) --gnu tests/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu tests/Makefile
|
||||||
|
.PRECIOUS: 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_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
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
|
||||||
|
col$(EXEEXT): $(col_OBJECTS) $(col_DEPENDENCIES) $(EXTRA_col_DEPENDENCIES)
|
||||||
|
@rm -f col$(EXEEXT)
|
||||||
|
$(LINK) $(col_OBJECTS) $(col_LDADD) $(LIBS)
|
||||||
|
invalidkeys$(EXEEXT): $(invalidkeys_OBJECTS) $(invalidkeys_DEPENDENCIES) $(EXTRA_invalidkeys_DEPENDENCIES)
|
||||||
|
@rm -f invalidkeys$(EXEEXT)
|
||||||
|
$(LINK) $(invalidkeys_OBJECTS) $(invalidkeys_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collisions.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalidkeys.Po@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
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"
|
||||||
|
|
||||||
|
cscopelist: $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP)'; \
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile
|
||||||
|
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:
|
||||||
|
|
||||||
|
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-checkPROGRAMS clean-generic clean-libtool \
|
||||||
|
mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am:
|
||||||
|
|
||||||
|
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 -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am:
|
||||||
|
|
||||||
|
.MAKE: check-am install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am check check-am clean \
|
||||||
|
clean-checkPROGRAMS clean-generic clean-libtool cscopelist \
|
||||||
|
ctags distclean distclean-compile distclean-generic \
|
||||||
|
distclean-libtool distclean-tags 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-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-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags uninstall uninstall-am
|
||||||
|
|
||||||
|
|
||||||
|
test: check
|
||||||
|
./unittests.pl unittests.cfg
|
||||||
|
|
||||||
|
stresstest: check
|
||||||
|
./unittests.pl stresstests.cfg
|
||||||
|
|
||||||
|
# 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:
|
||||||
7
tests/README
Normal file
7
tests/README
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Unittests fpr PCP.
|
||||||
|
|
||||||
|
Execute 'make test' here or from the top level directory
|
||||||
|
to run the unit tests. Usually all tests shall succeed.
|
||||||
|
|
||||||
|
Execute 'make stresstest' to run a longer stresstest. It
|
||||||
|
generates lots of keys and takes some time.
|
||||||
36
tests/bart.pub
Normal file
36
tests/bart.pub
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
----- BEGIN PCP PUBLIC KEY -----
|
||||||
|
Generated by: Pretty Curved Privacy Version 0.0.1
|
||||||
|
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
|
||||||
|
Owner: Bart Simpson
|
||||||
|
Mail: bart@springfield.com
|
||||||
|
Key-ID: 0x0E4512BE47CE0215
|
||||||
|
Public-Key: 1aHE2mHljT-}lCf(GM(ln.9(?}t9H+[c{$q!@$oEz#Y>r
|
||||||
|
Creation Time: 2013-10-26T13:37:27
|
||||||
|
Checksum: BA:10:B7:CC:79:C0:69:8E:F0:A8:4D:55:12:C2:E5:7E
|
||||||
|
47:62:7D:C2:02:9C:3D:48:04:1B:5D:7D:5D:32:F4:7F
|
||||||
|
Serial Number: 0xEE894128
|
||||||
|
Key Version: 0x00000001
|
||||||
|
Random Art ID: +----------------+
|
||||||
|
| .....+. |
|
||||||
|
| . . . ..o |
|
||||||
|
| = . .. |
|
||||||
|
| . . . |
|
||||||
|
| . . |
|
||||||
|
| . . |
|
||||||
|
| . . |
|
||||||
|
| . |
|
||||||
|
+----------------+
|
||||||
|
|
||||||
|
1aHE2mHljT-}lCf(GM(ln.9(?}t9H+[c{$q!@$oEA6^#NBrBH@ze:Mmzufpo4k$0>0tKr<c
|
||||||
|
ml<>NX[qmVTCVdi{Oj?f?+29S.w#wHF%}n{&GkBA/lw=8yME/LjO^XMUJDv=I(6a.%-r*X-
|
||||||
|
nVZS)=f1GiY1V.hvq5?tBcAiYKH#*pp546$pyhduq2JhXQ#k{Mmev}tUBwGyx/MI1pq=W)w
|
||||||
|
Cfij1g&pb+I98{>Y)72o6jtL0MDI27TeNgbiN6w+!=nBEx=?AL$.ZsyYkIa.2L*zPrShDR@
|
||||||
|
?BZtx>qfH{ixW!)Sv0A-inF}(Y:^n>hp+G:gD&=G37x2]*xw)[SEK-a(olso31TnwYEC3a[
|
||||||
|
Ss[wvvQTq0kYZ)+x(mM}x>q9>e[n*p0o9!*Pm8krDv@GqlEix{bt>?K.A!r(MY4CgvkVcT9
|
||||||
|
asOUmVLwwPdupK}HBUY=uU5P>53ncmJ+QsH8Uy#gkI}vlm#0HIC+J2pM&4.B%^!FV?UoRnL
|
||||||
|
EMA}1QbPI/ju0S3V$uJz^?$ugF?PEDvtPbK)!SfA$?.1Sa2T.&:.^va>^hnVya0Gz%4{7f:
|
||||||
|
Zmst}k&sL.7@]blr*deC[lst2ayum}V-z+6PaM1soAVxbisyY/!w(AF:Z7*vzjI5nKwtPW0
|
||||||
|
-Xm&ovi4NDTe/sCvT&jISh>UtWeB?8$C)S]>fhSrnmkM>Rgd1z^h:Z1/gbgS^RGY1PqucW%
|
||||||
|
0096104pc&)GiZV)[2M%DD:?sR{-Um:2%<GqJKWnh<HzAViL)5A3VyH1v1M:[m++wfOUH.a
|
||||||
|
q}SXc(EQlWd[?K1$t4gf8$$L
|
||||||
|
------ END PCP PUBLICKEY ------
|
||||||
32
tests/check-collisions.sh
Executable file
32
tests/check-collisions.sh
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
rounds=$1
|
||||||
|
|
||||||
|
if test -z "$rounds"; then
|
||||||
|
rounds=10
|
||||||
|
fi
|
||||||
|
|
||||||
|
make check
|
||||||
|
|
||||||
|
log="collisions.log"
|
||||||
|
name=""
|
||||||
|
echo "Checking collisions for hash algorithms with ${rounds} rounds:" > $log
|
||||||
|
|
||||||
|
for hash in c o f d s; do
|
||||||
|
case $hash in
|
||||||
|
o) name="OAT";;
|
||||||
|
c) name="CRC";;
|
||||||
|
s) name="SAX";;
|
||||||
|
d) name="DJB";;
|
||||||
|
f) name="FNV";;
|
||||||
|
esac
|
||||||
|
echo -n "Running ${rounds} x ${name} hash ... "
|
||||||
|
echo -n "Collisions for ${name}: " >> $log
|
||||||
|
./col -l ${rounds} -${hash} \
|
||||||
|
| sort | uniq -c | sort | grep -v "1 " | wc -l \
|
||||||
|
>> $log
|
||||||
|
echo "done."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Review $log for the results."
|
||||||
247
tests/collisions.c
Normal file
247
tests/collisions.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
Run:
|
||||||
|
|
||||||
|
./col -l 1000000 | sort | uniq -c | sort | grep -v "1 " | wc -l
|
||||||
|
|
||||||
|
This generates the hashes and shows the number of collisions.
|
||||||
|
Hash algorithm can be selected by commandline options, see col -h.
|
||||||
|
|
||||||
|
Algorithms from:
|
||||||
|
http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <sodium.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
// lib
|
||||||
|
#include "mem.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "digital_crc32.h"
|
||||||
|
|
||||||
|
#define ROUNDS 10
|
||||||
|
|
||||||
|
unsigned djb_hash ( void *key, int len ) {
|
||||||
|
unsigned char *p = key;
|
||||||
|
unsigned h = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < len; i++ )
|
||||||
|
h = 33 * h ^ p[i];
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned fnv_hash ( void *key, int len ) {
|
||||||
|
unsigned char *p = key;
|
||||||
|
unsigned h = 2166136261;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < len; i++ )
|
||||||
|
h = ( h * 16777619 ) ^ p[i];
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned sax_hash ( void *key, int len ) {
|
||||||
|
unsigned char *p = key;
|
||||||
|
unsigned h = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < len; i++ )
|
||||||
|
h ^= ( h << 5 ) + ( h >> 2 ) + p[i];
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned oat_hash ( void *key, int len ) {
|
||||||
|
unsigned char *p = key;
|
||||||
|
unsigned h = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < len; i++ ) {
|
||||||
|
h += p[i];
|
||||||
|
h += ( h << 10 );
|
||||||
|
h ^= ( h >> 6 );
|
||||||
|
}
|
||||||
|
|
||||||
|
h += ( h << 3 );
|
||||||
|
h ^= ( h >> 11 );
|
||||||
|
h += ( h << 15 );
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//#define jen_hashsize(n) ( 1U << (n) )
|
||||||
|
//#define jen_hashmask(n) ( jen_hashsize ( n ) - 1 )
|
||||||
|
|
||||||
|
#define jen_mix(a,b,c) \
|
||||||
|
{ \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 13 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 8 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 13 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 12 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 16 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 5 ); \
|
||||||
|
a -= b; a -= c; a ^= ( c >> 3 ); \
|
||||||
|
b -= c; b -= a; b ^= ( a << 10 ); \
|
||||||
|
c -= a; c -= b; c ^= ( b >> 15 ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned jen_hash ( unsigned char *k, unsigned length, unsigned initval ) {
|
||||||
|
unsigned a, b;
|
||||||
|
unsigned c = initval;
|
||||||
|
unsigned len = length;
|
||||||
|
|
||||||
|
a = b = 0x9e3779b9;
|
||||||
|
|
||||||
|
while ( len >= 12 ) {
|
||||||
|
a += ( k[0] + ( (unsigned)k[1] << 8 )
|
||||||
|
+ ( (unsigned)k[2] << 16 )
|
||||||
|
+ ( (unsigned)k[3] << 24 ) );
|
||||||
|
b += ( k[4] + ( (unsigned)k[5] << 8 )
|
||||||
|
+ ( (unsigned)k[6] << 16 )
|
||||||
|
+ ( (unsigned)k[7] << 24 ) );
|
||||||
|
c += ( k[8] + ( (unsigned)k[9] << 8 )
|
||||||
|
+ ( (unsigned)k[10] << 16 )
|
||||||
|
+ ( (unsigned)k[11] << 24 ) );
|
||||||
|
|
||||||
|
jen_mix ( a, b, c );
|
||||||
|
|
||||||
|
k += 12;
|
||||||
|
len -= 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
c += length;
|
||||||
|
|
||||||
|
switch ( len ) {
|
||||||
|
case 11: c += ( (unsigned)k[10] << 24 );
|
||||||
|
case 10: c += ( (unsigned)k[9] << 16 );
|
||||||
|
case 9 : c += ( (unsigned)k[8] << 8 );
|
||||||
|
/* First byte of c reserved for length */
|
||||||
|
case 8 : b += ( (unsigned)k[7] << 24 );
|
||||||
|
case 7 : b += ( (unsigned)k[6] << 16 );
|
||||||
|
case 6 : b += ( (unsigned)k[5] << 8 );
|
||||||
|
case 5 : b += k[4];
|
||||||
|
case 4 : a += ( (unsigned)k[3] << 24 );
|
||||||
|
case 3 : a += ( (unsigned)k[2] << 16 );
|
||||||
|
case 2 : a += ( (unsigned)k[1] << 8 );
|
||||||
|
case 1 : a += k[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
jen_mix ( a, b, c );
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char *keyid(int h, char *id, byte *pub, byte *sec) {
|
||||||
|
uint32_t s, p;
|
||||||
|
p = s = 0;
|
||||||
|
switch (h) {
|
||||||
|
case 1:
|
||||||
|
p = oat_hash(pub, 32);
|
||||||
|
s = oat_hash(sec, 32);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
p = digital_crc32(pub, 32);
|
||||||
|
s = digital_crc32(sec, 32);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
p = djb_hash(pub, 32);
|
||||||
|
s = djb_hash(sec, 32);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
p = fnv_hash(pub, 32);
|
||||||
|
s = fnv_hash(sec, 32);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
p = sax_hash(pub, 32);
|
||||||
|
s = sax_hash(sec, 32);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
p = jen_hash(pub, 32, 0xd4a1);
|
||||||
|
s = jen_hash(sec, 32, 0xe8c0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
snprintf(id, 17, "%08X%08X", p, s);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void usage () {
|
||||||
|
fprintf(stderr, "Options:\n");
|
||||||
|
fprintf(stderr, " -o use Jenkins OAT hashing\n");
|
||||||
|
fprintf(stderr, " -c use CRC32 checksums\n");
|
||||||
|
fprintf(stderr, " -d use DJB hash\n");
|
||||||
|
fprintf(stderr, " -s use SAX hash\n");
|
||||||
|
fprintf(stderr, " -f use FNV hash \n");
|
||||||
|
fprintf(stderr, " -j use Jenkins hash \n");
|
||||||
|
fprintf(stderr, " -l <rounds> specify rounds, default: 10\n");
|
||||||
|
fprintf(stderr, " -h print this help message\n");
|
||||||
|
fprintf(stderr, "When complete, check the output for collisions:\n");
|
||||||
|
fprintf(stderr, "cat hashfile | sort | uniq -c | sort | grep -v \"1 \" | wc -l\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
byte public[32] = { 0 };
|
||||||
|
byte secret[32] = { 0 };
|
||||||
|
char *id = ucmalloc(17);
|
||||||
|
int i;
|
||||||
|
int opt;
|
||||||
|
int h = 1;
|
||||||
|
long long rounds = ROUNDS;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
opt = getopt(argc, argv, "jsfdochl:");
|
||||||
|
|
||||||
|
if(opt == -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (opt) {
|
||||||
|
case 'o':
|
||||||
|
h = 1;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
h = 2;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
h = 3;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
h = 4;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
h = 5;
|
||||||
|
break;
|
||||||
|
case 'j':
|
||||||
|
h = 6;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
rounds = strtoll(optarg, NULL, 10);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(i=0; i<rounds; i++) {
|
||||||
|
crypto_box_keypair (public, secret);
|
||||||
|
id = keyid(h, id, public, secret);
|
||||||
|
printf("%s\n", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
14
tests/exportmasspubs.sh
Executable file
14
tests/exportmasspubs.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
outdir=$1
|
||||||
|
pcp=$2
|
||||||
|
vault=$3
|
||||||
|
|
||||||
|
if test -s "$vault"; then
|
||||||
|
# exports public keys
|
||||||
|
rm -f $outdir/0x*
|
||||||
|
$pcp -V $vault -l | grep 0x | awk '{print $1}' | while read id; do
|
||||||
|
$pcp -V $vault -p -i $id 2> /dev/null | egrep -v "^ " \
|
||||||
|
| egrep -v '^$' > $outdir/$id
|
||||||
|
done
|
||||||
|
fi
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user