add gpgkey
This commit is contained in:
parent
e7a907660a
commit
406d56e34f
141
COPYING
141
COPYING
|
@ -1,5 +1,5 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
@ -7,17 +7,15 @@
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
software and other kinds of works.
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
The licenses for most software and other practical works are designed
|
||||||
to take away your freedom to share and change the works. By contrast,
|
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
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
share and change all versions of a program--to make sure it remains free
|
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
|
software for all its users.
|
||||||
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
|
When we speak of free software, we are referring to freedom, not
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
@ -26,44 +24,34 @@ 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
|
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.
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
Developers that use our General Public Licenses protect your rights
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
you this License which gives you legal permission to copy, distribute
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
and/or modify the software.
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
A secondary benefit of defending all users' freedom is that
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
improvements made in alternate versions of the program, if they
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
receive widespread use, become available for other developers to
|
||||||
or can get the source code. And you must show them these terms so they
|
incorporate. Many developers of free software are heartened and
|
||||||
know their rights.
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
The GNU Affero General Public License is designed specifically to
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
ensure that, in such cases, the modified source code becomes available
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
An older license, called the Affero General Public License and
|
||||||
that there is no warranty for this free software. For both users' and
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
changed, so that their problems will not be attributed erroneously to
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
authors of previous versions.
|
this license.
|
||||||
|
|
||||||
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
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
@ -72,7 +60,7 @@ modification follow.
|
||||||
|
|
||||||
0. Definitions.
|
0. Definitions.
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
works, such as semiconductor masks.
|
works, such as semiconductor masks.
|
||||||
|
@ -549,35 +537,45 @@ 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
|
the Program, the only way you could satisfy both those terms and this
|
||||||
License would be to refrain entirely from conveying the Program.
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
Notwithstanding any other provision of this License, you have
|
||||||
permission to link or combine any covered work with a work licensed
|
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
|
under version 3 of the GNU General Public License into a single
|
||||||
combined work, and to convey the resulting work. The terms of this
|
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,
|
License will continue to apply to the part which is the covered work,
|
||||||
but the special requirements of the GNU Affero General Public License,
|
but the work with which it is combined will remain governed by version
|
||||||
section 13, concerning interaction through a network will apply to the
|
3 of the GNU General Public License.
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
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
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
Each version is given a distinguishing version number. If the
|
||||||
Program specifies that a certain numbered version of the GNU General
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
Public License "or any later version" applies to it, you have the
|
Public License "or any later version" applies to it, you have the
|
||||||
option of following the terms and conditions either of that numbered
|
option of following the terms and conditions either of that numbered
|
||||||
version or of any later version published by the Free Software
|
version or of any later version published by the Free Software
|
||||||
Foundation. If the Program does not specify a version number of the
|
Foundation. If the Program does not specify a version number of the
|
||||||
GNU General Public License, you may choose any version ever published
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
by the Free Software Foundation.
|
by the Free Software Foundation.
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
If the Program specifies that a proxy can decide which future
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
public statement of acceptance of a version permanently authorizes you
|
public statement of acceptance of a version permanently authorizes you
|
||||||
to choose that version for the Program.
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||||
Copyright (C) <year> <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
If your software can interact with users remotely through a computer
|
||||||
notice like this when it starts in an interactive mode:
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
<program> Copyright (C) <year> <name of author>
|
interface could display a "Source" link that leads users to an archive
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
of the code. There are many ways you could offer source, and different
|
||||||
This is free software, and you are welcome to redistribute it
|
solutions will be better for different programs; see section 13 for the
|
||||||
under certain conditions; type `show c' for details.
|
specific requirements.
|
||||||
|
|
||||||
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,
|
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.
|
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
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
<https://www.gnu.org/licenses/>.
|
<https://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
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -5,7 +5,7 @@ BINDIR ?= $(PREFIX)/bin
|
||||||
|
|
||||||
default: tests
|
default: tests
|
||||||
|
|
||||||
all: tests install
|
all: install tests
|
||||||
|
|
||||||
install:
|
install:
|
||||||
mkdir -p "$(BINDIR)"
|
mkdir -p "$(BINDIR)"
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: crypto.proto
|
||||||
|
|
||||||
|
import sys
|
||||||
|
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
|
||||||
|
from google.protobuf.internal import enum_type_wrapper
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='crypto.proto',
|
||||||
|
package='crypto.pb',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=_b('Z*github.com/libp2p/go-libp2p-core/crypto/pb'),
|
||||||
|
serialized_pb=_b('\n\x0c\x63rypto.proto\x12\tcrypto.pb\";\n\tPublicKey\x12 \n\x04Type\x18\x01 \x02(\x0e\x32\x12.crypto.pb.KeyType\x12\x0c\n\x04\x44\x61ta\x18\x02 \x02(\x0c\"<\n\nPrivateKey\x12 \n\x04Type\x18\x01 \x02(\x0e\x32\x12.crypto.pb.KeyType\x12\x0c\n\x04\x44\x61ta\x18\x02 \x02(\x0c*9\n\x07KeyType\x12\x07\n\x03RSA\x10\x00\x12\x0b\n\x07\x45\x64\x32\x35\x35\x31\x39\x10\x01\x12\r\n\tSecp256k1\x10\x02\x12\t\n\x05\x45\x43\x44SA\x10\x03\x42,Z*github.com/libp2p/go-libp2p-core/crypto/pb')
|
||||||
|
)
|
||||||
|
|
||||||
|
_KEYTYPE = _descriptor.EnumDescriptor(
|
||||||
|
name='KeyType',
|
||||||
|
full_name='crypto.pb.KeyType',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
values=[
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='RSA', index=0, number=0,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='Ed25519', index=1, number=1,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='Secp256k1', index=2, number=2,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='ECDSA', index=3, number=3,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
],
|
||||||
|
containing_type=None,
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_start=150,
|
||||||
|
serialized_end=207,
|
||||||
|
)
|
||||||
|
_sym_db.RegisterEnumDescriptor(_KEYTYPE)
|
||||||
|
|
||||||
|
KeyType = enum_type_wrapper.EnumTypeWrapper(_KEYTYPE)
|
||||||
|
RSA = 0
|
||||||
|
Ed25519 = 1
|
||||||
|
Secp256k1 = 2
|
||||||
|
ECDSA = 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_PUBLICKEY = _descriptor.Descriptor(
|
||||||
|
name='PublicKey',
|
||||||
|
full_name='crypto.pb.PublicKey',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='Type', full_name='crypto.pb.PublicKey.Type', index=0,
|
||||||
|
number=1, type=14, cpp_type=8, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='Data', full_name='crypto.pb.PublicKey.Data', index=1,
|
||||||
|
number=2, type=12, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=_b(""),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=27,
|
||||||
|
serialized_end=86,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_PRIVATEKEY = _descriptor.Descriptor(
|
||||||
|
name='PrivateKey',
|
||||||
|
full_name='crypto.pb.PrivateKey',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='Type', full_name='crypto.pb.PrivateKey.Type', index=0,
|
||||||
|
number=1, type=14, cpp_type=8, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='Data', full_name='crypto.pb.PrivateKey.Data', index=1,
|
||||||
|
number=2, type=12, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=_b(""),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=88,
|
||||||
|
serialized_end=148,
|
||||||
|
)
|
||||||
|
|
||||||
|
_PUBLICKEY.fields_by_name['Type'].enum_type = _KEYTYPE
|
||||||
|
_PRIVATEKEY.fields_by_name['Type'].enum_type = _KEYTYPE
|
||||||
|
DESCRIPTOR.message_types_by_name['PublicKey'] = _PUBLICKEY
|
||||||
|
DESCRIPTOR.message_types_by_name['PrivateKey'] = _PRIVATEKEY
|
||||||
|
DESCRIPTOR.enum_types_by_name['KeyType'] = _KEYTYPE
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
PublicKey = _reflection.GeneratedProtocolMessageType('PublicKey', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _PUBLICKEY,
|
||||||
|
__module__ = 'crypto_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:crypto.pb.PublicKey)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(PublicKey)
|
||||||
|
|
||||||
|
PrivateKey = _reflection.GeneratedProtocolMessageType('PrivateKey', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _PRIVATEKEY,
|
||||||
|
__module__ = 'crypto_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:crypto.pb.PrivateKey)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(PrivateKey)
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR._options = None
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
11
dpgpid
11
dpgpid
|
@ -1,9 +1,11 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# link: https://git.p2p.legal/aya/dpgpid/
|
# link: https://git.p2p.legal/aya/dpgpid/
|
||||||
# desc: dpgpid (Decentralized PGP IDentifiers) shares PGP keys with DIDs on IPFS
|
# desc: dpgpid (Decentralized PGP IDentifiers) shares PGP keys with DIDs on IPFS
|
||||||
# Copyright (C) 2022 Yann "aya" Autissier
|
|
||||||
|
# Copyleft 2022 Yann Autissier <aya@asycn.io>
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
@ -11,8 +13,13 @@
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
DATE=$(date -u +%FT%TZ%Z)
|
||||||
USAGE='[--help] [--version] show'
|
USAGE='[--help] [--version] show'
|
||||||
VERSION='0.0.1'
|
VERSION='0.0.1'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# link: https://git.p2p.legal/aya/dpgpid/
|
||||||
|
# desc: gpgkey converts ed25519 gpg keys to match duniter and ipfs format
|
||||||
|
|
||||||
|
# Copyleft 2022 Yann Autissier <aya@asycn.io>
|
||||||
|
# all crypto science belongs to Pascal Engélibert <tuxmain@zettascript.org>
|
||||||
|
# coming from files available at https://git.p2p.legal/qo-op/Astroport.ONE/tools
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import base58
|
||||||
|
import base64
|
||||||
|
import configparser
|
||||||
|
import crypto_pb2
|
||||||
|
import cryptography.hazmat.primitives.asymmetric.ed25519 as ed25519
|
||||||
|
from cryptography.hazmat.primitives import serialization
|
||||||
|
import duniterpy.key
|
||||||
|
import logging as log
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
__version__='0.0.1'
|
||||||
|
|
||||||
|
class gpgkey:
|
||||||
|
def __init__(self):
|
||||||
|
self.parser = argparse.ArgumentParser()
|
||||||
|
self.parser.add_argument(
|
||||||
|
"-d",
|
||||||
|
"--debug",
|
||||||
|
action="store_true",
|
||||||
|
help="show debug informations",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--input",
|
||||||
|
dest="input",
|
||||||
|
default=None,
|
||||||
|
help="read credentials from file INPUT",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
"-q",
|
||||||
|
"--quiet",
|
||||||
|
action="store_true",
|
||||||
|
help="show only errors",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
"-o",
|
||||||
|
"--output",
|
||||||
|
dest="output",
|
||||||
|
default=None,
|
||||||
|
help="write keys to file OUTPUT",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
"-v",
|
||||||
|
"--verbose",
|
||||||
|
action="store_true",
|
||||||
|
help="show more informations",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
"--version",
|
||||||
|
action="store_true",
|
||||||
|
help="show version and exit",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
'command',
|
||||||
|
help="duniter|ipfs",
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
'username',
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
'password',
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
|
|
||||||
|
def _check_args(self):
|
||||||
|
log.debug("func gpgkey._check_args(self)")
|
||||||
|
log.debug("var self.command: %s" % self.command)
|
||||||
|
log.debug("var self.username: %s" % self.username)
|
||||||
|
log.debug("var self.password: %s" % self.password)
|
||||||
|
if self.command:
|
||||||
|
if self.input is None:
|
||||||
|
if self.password is None or self.username is None:
|
||||||
|
self.parser.error(f"{self.command} requires an input file or username and password args")
|
||||||
|
|
||||||
|
def _invalid_command(self):
|
||||||
|
log.debug("func gpgkey._invalid_command(self)")
|
||||||
|
self.parser.error(f"{self.command} is not a valid command.")
|
||||||
|
|
||||||
|
def _load_config(self):
|
||||||
|
log.debug("func gpgkey._load_config(self)")
|
||||||
|
self.config = configparser.RawConfigParser()
|
||||||
|
config_dir = os.path.join(os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), 'dpgpid')
|
||||||
|
log.debug("var config_dir: %s" % config_dir)
|
||||||
|
self.config.read( [config_dir + '/gpgkey.conf'] )
|
||||||
|
|
||||||
|
def do_duniter(self):
|
||||||
|
log.debug("func gpgkey.do_duniter(self)")
|
||||||
|
self.duniterpy_from_salt_and_password()
|
||||||
|
print(self.duniterpy.pubkey)
|
||||||
|
if self.output is not None:
|
||||||
|
self.duniterpy.save_pubsec_file(self.output)
|
||||||
|
os.chmod(self.output, 0o600)
|
||||||
|
|
||||||
|
def do_ipfs(self):
|
||||||
|
log.info("func do_ipfs(self)")
|
||||||
|
if self.input is None:
|
||||||
|
self.duniterpy_from_salt_and_password()
|
||||||
|
self.ipfs_base58_shared_key=self.duniterpy.pubkey
|
||||||
|
self.ipfs_base58_secure_key=base58.b58encode(self.duniterpy.sk)
|
||||||
|
else:
|
||||||
|
for line in open(self.input, "r"):
|
||||||
|
if re.search("pub", line):
|
||||||
|
self.ipfs_base58_shared_key=line.replace('\n','').split(': ')[1]
|
||||||
|
elif re.search("sec", line):
|
||||||
|
self.ipfs_base58_secure_key=line.replace('\n','').split(': ')[1]
|
||||||
|
|
||||||
|
self.ipfs_from_ed25519_key()
|
||||||
|
print('PeerID={}'.format(self.ipfs_peerid))
|
||||||
|
print('PrivKEY={}'.format(self.ipfs_privkey))
|
||||||
|
|
||||||
|
def duniterpy_from_salt_and_password(self):
|
||||||
|
log.debug("func gpgkey.duniterpy_from_salt_and_password(self)")
|
||||||
|
scrypt_params = duniterpy.key.scrypt_params.ScryptParams(
|
||||||
|
int(self.config.get('scrypt', 'n')) if self.config.has_option('scrypt', 'n') else 4096,
|
||||||
|
int(self.config.get('scrypt', 'r')) if self.config.has_option('scrypt', 'r') else 16,
|
||||||
|
int(self.config.get('scrypt', 'p')) if self.config.has_option('scrypt', 'p') else 1,
|
||||||
|
int(self.config.get('scrypt', 'sl')) if self.config.has_option('scrypt', 'sl') else 32,
|
||||||
|
)
|
||||||
|
self.duniterpy = duniterpy.key.SigningKey.from_credentials(
|
||||||
|
self.username,
|
||||||
|
self.password,
|
||||||
|
scrypt_params
|
||||||
|
)
|
||||||
|
|
||||||
|
def ipfs_from_ed25519_key(self):
|
||||||
|
log.info("func ipfs_from_ed25519_key(self)")
|
||||||
|
|
||||||
|
# Decoding keys
|
||||||
|
decoded_shared = base58.b58decode(self.ipfs_base58_shared_key)
|
||||||
|
decoded_secure = base58.b58decode(self.ipfs_base58_secure_key)
|
||||||
|
ipfs_shared = ed25519.Ed25519PublicKey.from_public_bytes(decoded_shared)
|
||||||
|
ipfs_secure = ed25519.Ed25519PrivateKey.from_private_bytes(decoded_secure[:32])
|
||||||
|
ipfs_shared_bytes = ipfs_shared.public_bytes(encoding=serialization.Encoding.Raw,
|
||||||
|
format=serialization.PublicFormat.Raw)
|
||||||
|
ipfs_secure_bytes = ipfs_secure.private_bytes(encoding=serialization.Encoding.Raw,
|
||||||
|
format=serialization.PrivateFormat.Raw,
|
||||||
|
encryption_algorithm=serialization.NoEncryption())
|
||||||
|
|
||||||
|
# Formulating PeerID
|
||||||
|
ipfs_pid = base58.b58encode(b'\x00$\x08\x01\x12 ' + ipfs_shared_bytes)
|
||||||
|
PeerID = ipfs_pid.decode('ascii')
|
||||||
|
self.ipfs_peerid = ipfs_pid.decode('ascii')
|
||||||
|
|
||||||
|
# Serializing private key in IPFS-native mode, the private key contains public one
|
||||||
|
pkey = crypto_pb2.PrivateKey()
|
||||||
|
#pkey.Type = crypto_pb2.KeyType.Ed25519
|
||||||
|
pkey.Type = 1
|
||||||
|
pkey.Data = ipfs_secure_bytes + ipfs_shared_bytes
|
||||||
|
PrivKey = base64.b64encode(pkey.SerializeToString()).decode('ascii')
|
||||||
|
self.ipfs_privkey = base64.b64encode(pkey.SerializeToString()).decode('ascii')
|
||||||
|
|
||||||
|
def run(self, argv):
|
||||||
|
args = self.parser.parse_args(argv)
|
||||||
|
vars(self).update(vars(args))
|
||||||
|
|
||||||
|
# display version
|
||||||
|
if args.version:
|
||||||
|
version()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
# define log format
|
||||||
|
log_format='%(asctime)s %(levelname)s: %(message)s'
|
||||||
|
log_datefmt='%Y/%m/%d %H:%M:%S'
|
||||||
|
if args.debug:
|
||||||
|
log_level='DEBUG'
|
||||||
|
elif args.quiet:
|
||||||
|
log_level='ERROR'
|
||||||
|
elif args.verbose:
|
||||||
|
log_level='INFO'
|
||||||
|
else:
|
||||||
|
log_level='WARNING'
|
||||||
|
log.basicConfig(format=log_format, datefmt=log_datefmt, level=log_level)
|
||||||
|
|
||||||
|
self._check_args()
|
||||||
|
self._load_config()
|
||||||
|
method = getattr(self, f'do_{self.command}', self._invalid_command)
|
||||||
|
return method()
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
if argv is None:
|
||||||
|
argv = sys.argv[1:]
|
||||||
|
|
||||||
|
cli = gpgkey()
|
||||||
|
return cli.run(argv)
|
||||||
|
|
||||||
|
def version(version=__version__):
|
||||||
|
print("%s v%s" % (sys.argv[0],version))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
|
@ -0,0 +1,67 @@
|
||||||
|
#shellcheck shell=sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
gpgkey() {
|
||||||
|
./gpgkey "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
Describe 'Dependency'
|
||||||
|
Describe 'python3'
|
||||||
|
It 'is available'
|
||||||
|
When run which python3
|
||||||
|
The output should include "/python3"
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
End
|
||||||
|
End
|
||||||
|
|
||||||
|
Describe 'gpgkey'
|
||||||
|
Describe '--help'
|
||||||
|
It 'prints help'
|
||||||
|
When run gpgkey --help
|
||||||
|
The output should include 'usage:'
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
End
|
||||||
|
Describe '--version'
|
||||||
|
It 'prints version'
|
||||||
|
When run gpgkey --version
|
||||||
|
The output should include 'v0.0.1'
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
End
|
||||||
|
Describe 'duniter username password -o /tmp/test_gpgkey'
|
||||||
|
rm -f /tmp/test_gpgkey
|
||||||
|
It 'prints duniter public key and write duniter keys to file /tmp/test_gpgkey for user username'
|
||||||
|
When run gpgkey duniter username password -o /tmp/test_gpgkey
|
||||||
|
The output should eq '4YLU1xQ9jzb7LzC6d91VZrYTEKS9N2j93Nnvcee6wxZG'
|
||||||
|
The path '/tmp/test_gpgkey' should exist
|
||||||
|
The contents of file '/tmp/test_gpgkey' should include 'pub: 4YLU1xQ9jzb7LzC6d91VZrYTEKS9N2j93Nnvcee6wxZG'
|
||||||
|
The contents of file '/tmp/test_gpgkey' should include 'sec: K5heSX4xGUPtRbxcZh6zbgaKbDv8FeVc9JuSNWtUs7C1oGNKqv7kQJ3DHdouTPzoW4duKKnuLQK8LbHKfN9fkjC'
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
End
|
||||||
|
Describe 'ipfs -i /tmp/test_gpgkey'
|
||||||
|
It 'prints ipfs PeerID and PrivKEY for duniter keys in file /tmp/test_gpgkey'
|
||||||
|
When run gpgkey ipfs -i /tmp/test_gpgkey
|
||||||
|
The output should include 'PeerID=12D3KooWDMhdm5yrvtrbkshXFjkqLedHieUnPioczy9wzdnzquHC'
|
||||||
|
The output should include 'PrivKEY=CAESQA+XqCWjRqCjNe9oU3QA796bEH+T+rxgyPQ/EkXvE2MvNJoTbvcP+m51+XwxrmWqHaOpI1ZD0USwLjqAmV8Boas='
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
rm -f /tmp/test_gpgkey
|
||||||
|
End
|
||||||
|
Describe 'ipfs username password'
|
||||||
|
It 'prints ipfs PeerID and PrivKEY for user username'
|
||||||
|
When run gpgkey ipfs username password
|
||||||
|
The output should include 'PeerID=12D3KooWDMhdm5yrvtrbkshXFjkqLedHieUnPioczy9wzdnzquHC'
|
||||||
|
The output should include 'PrivKEY=CAESQA+XqCWjRqCjNe9oU3QA796bEH+T+rxgyPQ/EkXvE2MvNJoTbvcP+m51+XwxrmWqHaOpI1ZD0USwLjqAmV8Boas='
|
||||||
|
The status should be success
|
||||||
|
The stderr should equal ""
|
||||||
|
End
|
||||||
|
End
|
||||||
|
End
|
Loading…
Reference in New Issue