catched up api changes, fixed dysfunctional c++ signature api, enhanced c++ Buf class.

This commit is contained in:
TLINDEN
2014-02-16 15:29:19 +01:00
parent 1342fa2b45
commit 3f03f97992
7 changed files with 62 additions and 49 deletions

View File

@@ -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
View File

@@ -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.:

View File

@@ -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();

View File

@@ -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));
} }

View File

@@ -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);
}; };
}; };

View File

@@ -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;

View File

@@ -133,11 +133,9 @@ 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 cout << "3 ok" << endl;
if(SigB.verify(sig, message.length() + crypto_sign_BYTES) )
cout << "3 ok" << endl;
} }
void test4() { void test4() {