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

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

View File

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

View File

@@ -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<unsigned char> message);
unsigned char *sign(unsigned char *message, size_t mlen);
unsigned char *sign(Pcpstream *message);
bool sign(std::vector<unsigned char> 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<unsigned char> message);
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).
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 <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"
@@ -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<unsigned char> message) {
bool Signature::sign(std::vector<unsigned char> 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<unsigned char> 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<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)
m[i] = message[i];
bool _b = Signature::verify(m, message.size());
free(m);
return _b;
_sig.add((void *)message[i], 1);
return Signature::verify(_sig);
}
bool Signature::verify(unsigned char *signature, size_t mlen) {
@@ -134,15 +131,19 @@ bool Signature::verify(unsigned char *signature, size_t mlen) {
throw exception("No public key specified, unable to verify.");
}
char n[] = "verify";
Buffer *m = buffer_new(32, n);
buffer_add(m, signature, mlen);
Pcpstream *p = ps_new_inbuffer(m);
Buf _sig = Buf();
_sig.add(signature, mlen);
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);
ps_close(p);
if(pub != NULL) {
Signedby = PubKey(pub);