mirror of
https://codeberg.org/scip/pcp.git
synced 2025-12-17 03:50:57 +01:00
catched up api changes, fixed dysfunctional c++ signature api, enhanced c++ Buf class.
This commit is contained in:
@@ -53,6 +53,11 @@
|
|||||||
out and make the system work with the changes
|
out and make the system work with the changes
|
||||||
above.
|
above.
|
||||||
|
|
||||||
|
Added various convenience pubkey export formats,
|
||||||
|
beside pbp and pcp also supported are now perl,
|
||||||
|
c and yaml code. A programmer can use this to
|
||||||
|
put a public key in a small program.
|
||||||
|
|
||||||
0.2.0 ED25519 and Curve25519 keys are now generated
|
0.2.0 ED25519 and Curve25519 keys are now generated
|
||||||
separately (previously they were generated from
|
separately (previously they were generated from
|
||||||
one random seed, the curve had been derived from
|
one random seed, the curve had been derived from
|
||||||
|
|||||||
9
TODO
9
TODO
@@ -5,6 +5,7 @@ allow signing using an alternate secret key, like in pcpdecrypt()
|
|||||||
malloc() new pointers in functions only if not NULL, e.g. pcp_gennonce()
|
malloc() new pointers in functions only if not NULL, e.g. pcp_gennonce()
|
||||||
|
|
||||||
generalize file i/0, open+close only in src/, print msg if using stdin or stdout
|
generalize file i/0, open+close only in src/, print msg if using stdin or stdout
|
||||||
|
- sign + crypt done. key exports und imports to follow
|
||||||
|
|
||||||
check pub key count in pcp.c before calling verify signature, croak if count==0
|
check pub key count in pcp.c before calling verify signature, croak if count==0
|
||||||
|
|
||||||
@@ -14,8 +15,6 @@ Update pod key format spec.
|
|||||||
|
|
||||||
vault checksum: add keysigs as well
|
vault checksum: add keysigs as well
|
||||||
|
|
||||||
catch up with changes in c++ api
|
|
||||||
|
|
||||||
enable formats for secret key exports as well
|
enable formats for secret key exports as well
|
||||||
|
|
||||||
Unitttests:
|
Unitttests:
|
||||||
@@ -27,8 +26,10 @@ Unitttests:
|
|||||||
|
|
||||||
- sometimes secret key is empty
|
- sometimes secret key is empty
|
||||||
|
|
||||||
|
Possible causes: the unittest segfaults and unittest.pl doesn't
|
||||||
cpptest test3 fails, pcpstream backed with buffer behaves komisch
|
catch it, esp. if the prepare call segfaults. Or, there's some bug
|
||||||
|
in unittest.pl, however the issue started as I switched to the
|
||||||
|
pcpstream api.
|
||||||
|
|
||||||
|
|
||||||
Python binding, e.g.:
|
Python binding, e.g.:
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ namespace pcp {
|
|||||||
std::string get_str();
|
std::string get_str();
|
||||||
|
|
||||||
unsigned char *get_remainder();
|
unsigned char *get_remainder();
|
||||||
|
Buffer *get_buffer();
|
||||||
|
|
||||||
size_t extract(void *buf, size_t offset, size_t len);
|
size_t extract(void *buf, size_t offset, size_t len);
|
||||||
uint8_t get8();
|
uint8_t get8();
|
||||||
uint16_t get16();
|
uint16_t get16();
|
||||||
|
|||||||
@@ -96,6 +96,10 @@ unsigned char *Buf::get() {
|
|||||||
return buffer_get(B);
|
return buffer_get(B);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Buffer *Buf::get_buffer() {
|
||||||
|
return B;
|
||||||
|
}
|
||||||
|
|
||||||
string Buf::get_str() {
|
string Buf::get_str() {
|
||||||
return string(buffer_get_str(B));
|
return string(buffer_get_str(B));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "key++.h"
|
#include "key++.h"
|
||||||
#include "sign++.h"
|
#include "sign++.h"
|
||||||
#include "helpers++.h"
|
#include "helpers++.h"
|
||||||
|
#include "buffer++.h"
|
||||||
|
|
||||||
namespace pcp {
|
namespace pcp {
|
||||||
|
|
||||||
@@ -42,8 +43,8 @@ namespace pcp {
|
|||||||
PubKey P;
|
PubKey P;
|
||||||
Key S;
|
Key S;
|
||||||
Vault vault;
|
Vault vault;
|
||||||
unsigned char *sig;
|
|
||||||
PubKey Signedby;
|
PubKey Signedby;
|
||||||
|
Buf sig;
|
||||||
|
|
||||||
// constructors
|
// constructors
|
||||||
Signature(Key &skey); // sign only
|
Signature(Key &skey); // sign only
|
||||||
@@ -56,13 +57,14 @@ namespace pcp {
|
|||||||
|
|
||||||
// PK signature methods
|
// PK signature methods
|
||||||
// sender pubkey is P
|
// sender pubkey is P
|
||||||
unsigned char *sign(std::vector<unsigned char> message);
|
bool sign(std::vector<unsigned char> message);
|
||||||
unsigned char *sign(unsigned char *message, size_t mlen);
|
bool sign(unsigned char *message, size_t mlen);
|
||||||
unsigned char *sign(Pcpstream *message);
|
bool sign(Pcpstream *message);
|
||||||
|
|
||||||
// verify using P or use vault if defined
|
// verify using P or use vault if defined
|
||||||
bool verify(std::vector<unsigned char> message);
|
bool verify(std::vector<unsigned char> message);
|
||||||
bool verify(unsigned char *signature, size_t mlen);
|
bool verify(unsigned char *signature, size_t mlen);
|
||||||
|
bool verify(Buf _sig);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
This file is part of Pretty Curved Privacy (pcp1).
|
This file is part of Pretty Curved Privacy (pcp1).
|
||||||
|
|
||||||
Copyright (C) 2013 T.Linden.
|
Copyright (C) 2013-2014 T.c.Dein.
|
||||||
|
|
||||||
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 General Public License as published by
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
You can contact me by mail: <tlinden AT cpan DOT org>.
|
You can contact me by mail: <tom AT vondein DOT org>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sign++.h"
|
#include "sign++.h"
|
||||||
@@ -27,35 +27,29 @@ using namespace pcp;
|
|||||||
Signature::Signature(Key &skey) {
|
Signature::Signature(Key &skey) {
|
||||||
S = skey;
|
S = skey;
|
||||||
havevault = false;
|
havevault = false;
|
||||||
sig = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Signature::Signature(PubKey &pkey) {
|
Signature::Signature(PubKey &pkey) {
|
||||||
P = pkey;
|
P = pkey;
|
||||||
havevault = false;
|
havevault = false;
|
||||||
sig = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Signature::Signature(Key &skey, PubKey &pkey) {
|
Signature::Signature(Key &skey, PubKey &pkey) {
|
||||||
P = pkey;
|
P = pkey;
|
||||||
S = skey;
|
S = skey;
|
||||||
havevault = false;
|
havevault = false;
|
||||||
sig = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Signature::Signature(Vault &v) {
|
Signature::Signature(Vault &v) {
|
||||||
vault = v;
|
vault = v;
|
||||||
havevault = true;
|
havevault = true;
|
||||||
sig = NULL;
|
|
||||||
S = vault.get_primary();
|
S = vault.get_primary();
|
||||||
}
|
}
|
||||||
|
|
||||||
Signature::~Signature() {
|
Signature::~Signature() {
|
||||||
if(sig != NULL)
|
|
||||||
free(sig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *Signature::sign(std::vector<unsigned char> message) {
|
bool Signature::sign(std::vector<unsigned char> message) {
|
||||||
if(! S)
|
if(! S)
|
||||||
throw exception("Error: cannot sign without a secret key, use another constructor.");
|
throw exception("Error: cannot sign without a secret key, use another constructor.");
|
||||||
|
|
||||||
@@ -69,17 +63,17 @@ unsigned char *Signature::sign(std::vector<unsigned char> message) {
|
|||||||
buffer_add(m, (void *)message[i], 1);
|
buffer_add(m, (void *)message[i], 1);
|
||||||
|
|
||||||
Pcpstream *p = ps_new_inbuffer(m);
|
Pcpstream *p = ps_new_inbuffer(m);
|
||||||
unsigned char *sig = Signature::sign(p);
|
bool ok = Signature::sign(p);
|
||||||
ps_close(p);
|
ps_close(p);
|
||||||
buffer_free(m);
|
buffer_free(m);
|
||||||
|
|
||||||
if(sig == NULL)
|
if(!ok)
|
||||||
throw exception();
|
throw exception();
|
||||||
|
|
||||||
return sig;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *Signature::sign(unsigned char *message, size_t mlen) {
|
bool Signature::sign(unsigned char *message, size_t mlen) {
|
||||||
if(! S)
|
if(! S)
|
||||||
throw exception("Error: cannot sign without a secret key, use another constructor.");
|
throw exception("Error: cannot sign without a secret key, use another constructor.");
|
||||||
|
|
||||||
@@ -91,42 +85,45 @@ unsigned char *Signature::sign(unsigned char *message, size_t mlen) {
|
|||||||
buffer_add(m, message, mlen);
|
buffer_add(m, message, mlen);
|
||||||
Pcpstream *p = ps_new_inbuffer(m);
|
Pcpstream *p = ps_new_inbuffer(m);
|
||||||
|
|
||||||
unsigned char *sig = Signature::sign(p);
|
bool ok = Signature::sign(p);
|
||||||
ps_close(p);
|
ps_close(p);
|
||||||
buffer_free(m);
|
buffer_free(m);
|
||||||
|
|
||||||
if(sig == NULL)
|
if(! ok)
|
||||||
throw exception();
|
throw exception();
|
||||||
|
|
||||||
return sig;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *Signature::sign(Pcpstream *message) {
|
bool Signature::sign(Pcpstream *message) {
|
||||||
Pcpstream *out = ps_new_outbuffer();
|
Pcpstream *out = ps_new_outbuffer();
|
||||||
unsigned char *sig = NULL;
|
|
||||||
|
|
||||||
size_t sigsize = pcp_ed_sign_buffered(message, out, S.K, 1);
|
size_t sigsize = pcp_ed_sign_buffered(message, out, S.K, 0);
|
||||||
|
|
||||||
if(sigsize > 0) {
|
if(sigsize > 0) {
|
||||||
Buffer *o = ps_buffer(out);
|
Buffer *o = ps_buffer(out);
|
||||||
sigsize = buffer_size(o);
|
sig.add_buf(o);
|
||||||
buffer_dump(o);
|
}
|
||||||
sig = (unsigned char*)ucmalloc(sigsize);
|
else {
|
||||||
buffer_get_chunk(o, sig, sigsize);
|
ps_close(out);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ps_close(out);
|
ps_close(out);
|
||||||
|
|
||||||
return sig;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Signature::verify(vector<unsigned char> message) {
|
bool Signature::verify(vector<unsigned char> message) {
|
||||||
unsigned char *m = (unsigned char *)ucmalloc(message.size());
|
if(!P) {
|
||||||
|
throw exception("No public key specified, unable to verify.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Buf _sig = Buf();
|
||||||
|
|
||||||
for(size_t i=0; i<message.size(); ++i)
|
for(size_t i=0; i<message.size(); ++i)
|
||||||
m[i] = message[i];
|
_sig.add((void *)message[i], 1);
|
||||||
bool _b = Signature::verify(m, message.size());
|
|
||||||
free(m);
|
return Signature::verify(_sig);
|
||||||
return _b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Signature::verify(unsigned char *signature, size_t mlen) {
|
bool Signature::verify(unsigned char *signature, size_t mlen) {
|
||||||
@@ -134,16 +131,20 @@ bool Signature::verify(unsigned char *signature, size_t mlen) {
|
|||||||
throw exception("No public key specified, unable to verify.");
|
throw exception("No public key specified, unable to verify.");
|
||||||
}
|
}
|
||||||
|
|
||||||
char n[] = "verify";
|
Buf _sig = Buf();
|
||||||
Buffer *m = buffer_new(32, n);
|
_sig.add(signature, mlen);
|
||||||
buffer_add(m, signature, mlen);
|
|
||||||
Pcpstream *p = ps_new_inbuffer(m);
|
return Signature::verify(_sig);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Signature::verify(Buf _sig) {
|
||||||
|
Pcpstream *p = ps_new_inbuffer(_sig.get_buffer());
|
||||||
|
|
||||||
pcp_pubkey_t *pub = pcp_ed_verify_buffered(p, P.K);
|
pcp_pubkey_t *pub = pcp_ed_verify_buffered(p, P.K);
|
||||||
|
|
||||||
ps_close(p);
|
ps_close(p);
|
||||||
|
|
||||||
|
|
||||||
if(pub != NULL) {
|
if(pub != NULL) {
|
||||||
Signedby = PubKey(pub);
|
Signedby = PubKey(pub);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -133,10 +133,8 @@ void test3() {
|
|||||||
Signature SigA(A);
|
Signature SigA(A);
|
||||||
Signature SigB(PA);
|
Signature SigB(PA);
|
||||||
|
|
||||||
unsigned char *sig = SigA.sign((unsigned char*)message.c_str(), message.length());
|
if(SigA.sign((unsigned char*)message.c_str(), message.length()))
|
||||||
|
if(SigB.verify(SigA.sig) )
|
||||||
// FIXME: bad api here
|
|
||||||
if(SigB.verify(sig, message.length() + crypto_sign_BYTES) )
|
|
||||||
cout << "3 ok" << endl;
|
cout << "3 ok" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user