diff --git a/Makefile b/Makefile index 2373033..87b5aad 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,14 @@ DEBUG = true export DEBUG -OBJS = crypto/*.o crypto/encoding/*.o thirdparty/mbedtls/*.o hashmap/hashmap.o +OBJS = crypto/*.o crypto/encoding/*.o thirdparty/mbedtls/*.o hashmap/hashmap.o record/*.o compile: cd crypto; make all; cd thirdparty; make all; cd hashmap; make all; + cd record; make all; ar rcs libp2p.a $(OBJS) test: compile @@ -21,5 +22,6 @@ clean: cd hashmap; make clean; cd thirdparty; make clean cd test; make clean; + cd record; make clean; rm -rf libp2p.a diff --git a/include/libp2p/record/record.h b/include/libp2p/record/record.h new file mode 100644 index 0000000..b29003f --- /dev/null +++ b/include/libp2p/record/record.h @@ -0,0 +1,7 @@ +#ifndef LIBP2P_RECORD_H + #define LIBP2P_RECORD_H + + #define RECORD_BUFSIZE 1024 + + int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign); +#endif // LIBP2P_RECORD_H diff --git a/record/Makefile b/record/Makefile new file mode 100644 index 0000000..f72c847 --- /dev/null +++ b/record/Makefile @@ -0,0 +1,14 @@ +CC = gcc +CFLAGS = -O0 -I../include -I../../c-protobuf -I../../c-multihash/include -g3 +LFLAGS = +DEPS = +OBJS = record.o + +%.o: %.c $(DEPS) + $(CC) -c -o $@ $< $(CFLAGS) + + +all: $(OBJS) + +clean: + rm -f $(OBJS) diff --git a/record/record.c b/record/record.c new file mode 100644 index 0000000..3cd8af2 --- /dev/null +++ b/record/record.c @@ -0,0 +1,67 @@ +#include +#include + +#include "libp2p/crypto/rsa.h" +#include "libp2p/record/record.h" +#include "protobuf.h" +#include "mh/hashes.h" +#include "mh/multihash.h" + +// libp2p_record_make_put_record creates and signs a dht record for the given key/value pair +int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign) +{ + char *pkh, *p; + int pkh_len; + size_t len = 0, l; + + *record = NULL; *rec_size = 0; + p = malloc(RECORD_BUFSIZE); + + if (p) { + memset (p, '\0', len); + if (!protobuf_encode_string (1, WIRETYPE_LENGTH_DELIMITED, key, p, RECORD_BUFSIZE, &l)) { + free (p); + return -1; + } + len += l; + if (!protobuf_encode_length_delimited (2, WIRETYPE_LENGTH_DELIMITED, value, vlen, p+len, RECORD_BUFSIZE-len, &l)) { + free (p); + return -1; + } + len += l; + pkh_len = mh_new_length(MH_H_SHA2_256, sk->public_key_length); + pkh = malloc(pkh_len); + if (!pkh) { + free (p); + return -1; + } + if (mh_new(pkh, MH_H_SHA2_256, sk->public_key_der, sk->public_key_length)) { + free (pkh); + free (p); + return -1; + } + if (!protobuf_encode_length_delimited (3, WIRETYPE_LENGTH_DELIMITED, pkh, pkh_len, p+len, RECORD_BUFSIZE-len, &l)) { + free (pkh); + free (p); + return -1; + } + free (pkh); + len += l; + if (sign) { + //TODO: missing signature function at libp2p-crypto ? + //sign(sk, signature, p, len); + //proto encode signature. + free (pkh); + free (p); + return -1; // not implemented. + } + } + *record = realloc(p, len); // Reduces memory used for just what is needed. + if (*record) { + *rec_size = len; + } else { + free (p); + return -1; + } + return 0; // sucess. +}