diff --git a/ChangeLog b/ChangeLog index c4a7108..cf09107 100644 --- a/ChangeLog +++ b/ChangeLog @@ -48,11 +48,16 @@ wrapper around file i/o or buffer i/o. It's used in libpcp/crypto.c (more to follow), so it depends on the caller if it works on files or on buffers. - + Lots of refactoring have been done to clear things out and make the system work with the changes 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 separately (previously they were generated from one random seed, the curve had been derived from diff --git a/TODO b/TODO index 2af7ca5..f3719d0 100644 --- a/TODO +++ b/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() 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 @@ -14,8 +15,6 @@ Update pod key format spec. vault checksum: add keysigs as well -catch up with changes in c++ api - enable formats for secret key exports as well Unitttests: @@ -27,8 +26,10 @@ Unitttests: - sometimes secret key is empty - -cpptest test3 fails, pcpstream backed with buffer behaves komisch + Possible causes: the unittest segfaults and unittest.pl doesn't + 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.: diff --git a/bindings/cpp/buffer++.h b/bindings/cpp/buffer++.h index 049e232..ef72b95 100644 --- a/bindings/cpp/buffer++.h +++ b/bindings/cpp/buffer++.h @@ -64,6 +64,8 @@ namespace pcp { std::string get_str(); unsigned char *get_remainder(); + Buffer *get_buffer(); + size_t extract(void *buf, size_t offset, size_t len); uint8_t get8(); uint16_t get16(); diff --git a/bindings/cpp/buffer.cpp b/bindings/cpp/buffer.cpp index 0c43566..b97d36e 100644 --- a/bindings/cpp/buffer.cpp +++ b/bindings/cpp/buffer.cpp @@ -96,6 +96,10 @@ unsigned char *Buf::get() { return buffer_get(B); } +Buffer *Buf::get_buffer() { + return B; +} + string Buf::get_str() { return string(buffer_get_str(B)); } diff --git a/bindings/cpp/sign++.h b/bindings/cpp/sign++.h index 6328200..671de12 100644 --- a/bindings/cpp/sign++.h +++ b/bindings/cpp/sign++.h @@ -31,6 +31,7 @@ #include "key++.h" #include "sign++.h" #include "helpers++.h" +#include "buffer++.h" namespace pcp { @@ -42,8 +43,8 @@ namespace pcp { PubKey P; Key S; Vault vault; - unsigned char *sig; PubKey Signedby; + Buf sig; // constructors Signature(Key &skey); // sign only @@ -56,13 +57,14 @@ namespace pcp { // PK signature methods // sender pubkey is P - unsigned char *sign(std::vector message); - unsigned char *sign(unsigned char *message, size_t mlen); - unsigned char *sign(Pcpstream *message); + bool sign(std::vector message); + bool sign(unsigned char *message, size_t mlen); + bool sign(Pcpstream *message); // verify using P or use vault if defined bool verify(std::vector message); bool verify(unsigned char *signature, size_t mlen); + bool verify(Buf _sig); }; }; diff --git a/bindings/cpp/sign.cpp b/bindings/cpp/sign.cpp index 55761fc..2338c24 100644 --- a/bindings/cpp/sign.cpp +++ b/bindings/cpp/sign.cpp @@ -1,7 +1,7 @@ /* 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 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 along with this program. If not, see . - You can contact me by mail: . + You can contact me by mail: . */ #include "sign++.h" @@ -27,35 +27,29 @@ using namespace pcp; Signature::Signature(Key &skey) { S = skey; havevault = false; - sig = NULL; } Signature::Signature(PubKey &pkey) { P = pkey; havevault = false; - sig = NULL; } Signature::Signature(Key &skey, PubKey &pkey) { P = pkey; S = skey; havevault = false; - sig = NULL; } Signature::Signature(Vault &v) { vault = v; havevault = true; - sig = NULL; S = vault.get_primary(); } Signature::~Signature() { - if(sig != NULL) - free(sig); } -unsigned char *Signature::sign(std::vector message) { +bool Signature::sign(std::vector message) { if(! S) throw exception("Error: cannot sign without a secret key, use another constructor."); @@ -69,17 +63,17 @@ unsigned char *Signature::sign(std::vector message) { buffer_add(m, (void *)message[i], 1); Pcpstream *p = ps_new_inbuffer(m); - unsigned char *sig = Signature::sign(p); + bool ok = Signature::sign(p); ps_close(p); buffer_free(m); - if(sig == NULL) + if(!ok) 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) 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); Pcpstream *p = ps_new_inbuffer(m); - unsigned char *sig = Signature::sign(p); + bool ok = Signature::sign(p); ps_close(p); buffer_free(m); - if(sig == NULL) + if(! ok) throw exception(); - return sig; + return true; } -unsigned char *Signature::sign(Pcpstream *message) { +bool Signature::sign(Pcpstream *message) { 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) { Buffer *o = ps_buffer(out); - sigsize = buffer_size(o); - buffer_dump(o); - sig = (unsigned char*)ucmalloc(sigsize); - buffer_get_chunk(o, sig, sigsize); + sig.add_buf(o); + } + else { + ps_close(out); + return false; } - ps_close(out); - return sig; + return true; } bool Signature::verify(vector 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