Create the actual RsaSignature2017, swap out string creation for date/time time_t field

master
teknomunk 1 year ago
parent a48a288782
commit c36c52de5c

@ -1 +1 @@
Subproject commit da7cb6bc910db8935dddf69ad9b559fc6db05aa1
Subproject commit 4a6ee5f1edb61cf893a12446da7e5ba4652a8b67

@ -80,7 +80,7 @@ static bool process_one( int id )
} while( iter );
free(toline);
ap_activity_create_rsa_signature_2017( act );
ap_activity_create_rsa_signature_2017( act, keys );
for( int i = 0; i < inboxes.count; ++i ) {
const char* inbox = inboxes.items[i];
@ -92,11 +92,12 @@ static bool process_one( int id )
}
// TODO: HTTP POST request
ap_activity_write_to_FILE( act, stdout );
http_signature_free( &hs );
}
// NOT FINISHED DEVELOPING
printf( "\n\nNOT FINISHED DEVELOPING\n\n" );
goto failed;
discard:

@ -28,9 +28,7 @@ static bool handle_owner_actor( struct http_request* req )
http_request_send_headers( req, 200, "application/activity+json", true );
FILE* f = http_request_get_response_body(req);
#define RENDER
#include "src/view/owner_actor.json.inc"
#undef RENDER
#include "src/view/owner_actor.json.inc"
return true;
}

@ -1 +1 @@
Subproject commit 6cf050b1f1a6f5062167b64c7ddb80a6cc5c2339
Subproject commit 451767866d52ee435e0c8894d0f4ead36b5d5676

@ -20,7 +20,7 @@ static struct json_enum ap_signature_type_enum[] = {
static struct json_object_field ap_signature_layout[] = {
{ "type", offsetof( struct ap_signature, type ), true, &json_field_enum, ap_signature_type_enum },
{ "creator", offsetof( struct ap_signature, creator ), true, &json_field_string },
{ "created", offsetof( struct ap_signature, created ), true, &json_field_string }, // TODO: date parser
{ "created", offsetof( struct ap_signature, created ), true, &json_field_date_time },
{ "signatureValue", offsetof( struct ap_signature, value ), true, &json_field_string },
{ NULL },
};
@ -118,7 +118,7 @@ struct ap_activity* ap_activity_dup( struct ap_activity* act )
new_act->has_signature = true;
new_act->signature.type = act->signature.type;
new_act->signature.creator = strdup(act->signature.creator);
new_act->signature.created = strdup(act->signature.created);
new_act->signature.created = act->signature.created;
new_act->signature.value = strdup(act->signature.value);
}
@ -166,7 +166,6 @@ void ap_activity_free_composite( struct ap_activity* act )
free( act->state );
free( act->signature.creator );
free( act->signature.created );
free( act->signature.value );
}
static void ap_activity_free2( void* ptr )

@ -2,6 +2,8 @@
#include "json/layout.h"
#include <time.h>
enum ap_signature_type
{
apst_rsa_signature_2017 = 1,
@ -11,7 +13,7 @@ struct ap_signature
{
int type;
char* creator;
char* created;
time_t created;
char* value;
};

@ -1,12 +1,16 @@
#define _GNU_SOURCE
#include "rsa_signature_2017.h"
#include "model/ap/activity.h"
#include "model/crypto/keys.h"
#include "rdf/serial.h"
#include "rdf/memory_store.h"
#include "rdf/normalize.h"
#include "collections/iface.h"
#include "sha256/sha256.h"
#include "collections/collection.h"
#include <string.h>
#include <stdio.h>
@ -36,16 +40,18 @@ static struct rdf_serialize_field activity_ref_types[] = {
struct rdf_serialize_field ap_activity_rdf[] = {
{ "", offsetof( struct ap_activity, id ), &rdf_id_field },
{ "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>", offsetof( struct ap_activity, type ), &rdf_enum_field, &types },
{ "<https://www.w3.org/ns/activitystreams#actor>", offsetof( struct ap_activity, actor ), &rdf_string_field },
{ "<https://www.w3.org/ns/activitystreams#to>", offsetof( struct ap_activity, to ), &rdf_array_of_field, &rdf_string_field },
{ "<https://www.w3.org/ns/activitystreams#cc>", offsetof( struct ap_activity, cc ), &rdf_array_of_field, &rdf_string_field },
{ "<https://www.w3.org/ns/activitystreams#bcc>", offsetof( struct ap_activity, bcc ), &rdf_array_of_field, &rdf_string_field },
{ "<https://www.w3.org/ns/activitystreams#actor>", offsetof( struct ap_activity, actor ), &rdf_string_ref_field },
{ "<https://www.w3.org/ns/activitystreams#to>", offsetof( struct ap_activity, to ), &rdf_array_of_field, &rdf_string_ref_field },
{ "<https://www.w3.org/ns/activitystreams#cc>", offsetof( struct ap_activity, cc ), &rdf_array_of_field, &rdf_string_ref_field },
{ "<https://www.w3.org/ns/activitystreams#bcc>", offsetof( struct ap_activity, bcc ), &rdf_array_of_field, &rdf_string_ref_field },
{ "<https://www.w3.org/ns/activitystreams#object>", offsetof( struct ap_activity, object.tag ), &rdf_tagged_union_field, activity_ref_types },
{ NULL, sizeof(struct ap_activity) },
};
struct rdf_serialize_field ap_activity_signature_rdf[] = {
{ "", 0, &rdf_id_blank },
{ "", 0, &rdf_id_blank },
{ "<http://purl.org/dc/terms/creator>", offsetof( struct ap_signature, creator ), &rdf_string_ref_field },
{ "<http://purl.org/dc/terms/created>", offsetof( struct ap_signature, created ), &rdf_date_field },
{ NULL },
};
@ -62,7 +68,7 @@ char* serialize_normalized_object( struct rdf_serialize_field* layout, void* obj
rdf_serialize_object( &rs, layout, object );
// Normalize
struct collection_iface i;
struct collection i;
rdf_memory_store_as_collection( ms, &i );
rdf_normalize(i);
@ -84,29 +90,53 @@ cleanup:
return outbuf;
}
void ap_activity_create_rsa_signature_2017( struct ap_activity* act )
static bool calculate_hash_for_object( struct rdf_serialize_field* layout, void* object, char* hash )
{
size_t size = 0;
// Serialize to normalized RDF
char* buffer = serialize_normalized_object( layout, object, &size );
if( !buffer ) {
return false;
}
// Hash with SHA-256
sha256_easy_hash( buffer, size, &hash[0] );
// Debug
printf( "RDF: \n" );
fwrite( buffer, size, 1, stdout );
printf( "\nHash: " );
for( int i = 0; i < 32; ++i ) {
printf( "%02X", (int)((unsigned char*)hash)[i] );
}
printf( "\n" );
free(buffer);
return true;
}
bool ap_activity_create_rsa_signature_2017( struct ap_activity* act, struct crypto_keys* keys )
{
char* activity_buf = NULL;
char* signature_buf = NULL;
printf( "ap_activity_create_rsa_signature_2017\n" );
size_t activity_buf_size = 0;
activity_buf = serialize_normalized_object( ap_activity_rdf, act, &activity_buf_size );
if( !activity_buf ) { return /* false */; }
// Setup signature
asprintf( &act->signature.creator, "%s#main-key", act->actor );
act->signature.created = time(NULL);
size_t signature_buf_size = 0;
signature_buf = serialize_normalized_object( ap_activity_signature_rdf, &act->signature, &signature_buf_size );
if( !signature_buf ) { return /* false */; }
char raw_hash[64];
if( !calculate_hash_for_object( ap_activity_rdf, act, &raw_hash[0] ) ) { return NULL; }
if( !calculate_hash_for_object( ap_activity_signature_rdf, &act->signature, &raw_hash[32] ) ) { return NULL; }
printf( "\nRDF (size=%d):\n", activity_buf_size );
fwrite( activity_buf, 1, activity_buf_size, stdout );
printf( "\n" );
fwrite( signature_buf, 1, signature_buf_size, stdout );
printf( "\n" );
char hash[32];
sha256_easy_hash( raw_hash, 64, &hash[0] );
cleanup:
free(activity_buf);
free(signature_buf);
return;
char* sign = crypto_keys_sign( keys, &hash[0], 32 );
act->signature.value = sign;
act->signature.type = apst_rsa_signature_2017;
printf( "act->signature = %s\n", sign );
return (act->has_signature = !!act->signature.value);
}

@ -1,6 +1,9 @@
#pragma once
#include <stdbool.h>
struct ap_activity;
struct crypto_keys;
void ap_activity_create_rsa_signature_2017( struct ap_activity* act );
bool ap_activity_create_rsa_signature_2017( struct ap_activity* act, struct crypto_keys* keys );

@ -22,7 +22,7 @@ bool http_signature_make( const char* inbox, struct crypto_keys* keys, struct ht
char* path = index( &inbox[8], '/' );
char* host = sign->host = strndup( &inbox[8], path - &inbox[8] );
// Build HTTP date
// Build HTTP date - TODO: move to separate file
time_t utc_time = time(NULL);
struct tm gmtime_data;
gmtime_r( &utc_time, &gmtime_data );
@ -50,6 +50,7 @@ bool http_signature_make( const char* inbox, struct crypto_keys* keys, struct ht
char hash[32];
sha256_easy_hash( hash_line, strlen(hash_line), hash );
sign->signature = crypto_keys_sign( keys, hash, 32 );
printf( "Signature: %s\n", sign->signature );
return true;
}

@ -2,6 +2,7 @@
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <openssl/err.h>
struct crypto_keys
{
@ -97,6 +98,7 @@ char* base64_strict_encode( void* v_binary, size_t len )
}
char* crypto_keys_sign( struct crypto_keys* keys, void* data, unsigned int size )
{
char buffer[512];
char* result = NULL;
char* sign_binary = NULL;
EVP_PKEY_CTX* ctx = NULL;
@ -116,8 +118,14 @@ char* crypto_keys_sign( struct crypto_keys* keys, void* data, unsigned int size
if( EVP_PKEY_sign(ctx, NULL, &siglen, data, size ) <= 0 ) { goto failed; }
sign_binary = malloc(siglen);
if( !sign_binary ) { goto failed; }
if( EVP_PKEY_sign(ctx, sign_binary, &siglen, data, size) <= 0 ) { goto failed; }
int retcode = EVP_PKEY_sign(ctx, sign_binary, &siglen, data, size);
if( retcode <= 0 ) {
ERR_error_string_n( retcode, buffer, sizeof(buffer) );
printf( "Failed to create signature: %s\n", buffer );
goto failed;
}
result = base64_strict_encode( sign_binary, siglen );
cleanup:

@ -1 +1 @@
Subproject commit 1286a00739af2b75bfebd1e01b84873d82ab0861
Subproject commit 06e2b87da59115047d62e248f0c79d14ae6ec912
Loading…
Cancel
Save