Commit e1761cef authored by filatov's avatar filatov
Browse files

generate pub key files with certificates

parent 2526760d
......@@ -37,6 +37,19 @@ static const char * const _key_formats[] = {
"bin", "hex", "pem", NULL
};
typedef struct {
const char * cert;
const char * vkey;
const char * vkey_pub;
const char * ekey;
const char * ekey_pub;
} extensions_t;
#define EXT_CERT ".oer"
#define EXT_VKEY ".vkey"
#define EXT_EKEY ".ekey"
#define EXT_PUB "_pub"
static copt_t _options [] = {
{ "h?", "help", COPT_HELP, NULL, "Print this help page" },
{ "C", "config", COPT_CFGFILE, (void*)&_cfgFile, "Config file path [no cfg file]" },
......@@ -55,8 +68,8 @@ static copt_t _options [] = {
static int is_P384CurvePoint_empty(EccP384CurvePoint_t* point);
static int is_P256CurvePoint_empty(EccP256CurvePoint_t* point);
static void fill_curve_point_eccP256(EccP256CurvePoint_t* point, ecc_curve_id curveType, const char * keyPath);
static void fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id curveType, const char * keyPath);
static void fill_curve_point_eccP256(EccP256CurvePoint_t* point, ecc_curve_id curveType, char * keyPath);
static void fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id curveType, char * keyPath);
static int _issuer_parser_cb(pxml_chunk_type_e _type,
const void *_chunk_data, size_t _chunk_size, void *_key)
......@@ -137,7 +150,7 @@ static asn_enc_rval_t Signature_oer_encoder(const asn_TYPE_descriptor_t *td,
if (sName == NULL && _cert->issuer.present == IssuerIdentifier_PR_self)
sName = _profileName;
char* pk = cvstrdup(_keyPath, "/", sName, ".vkey", NULL);
char* pk = cvstrdup(_keyPath, "/", sName, EXT_VKEY, NULL);
void *k = ecc_key_private_load(pk, alg);
if (k){
char h[48];
......@@ -291,7 +304,7 @@ int main(int argc, char ** argv)
// generate keys if necessary
// buf = name of private key file
cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, ".vkey", NULL);
cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, EXT_VKEY, NULL);
if (_force){
remove(buf);
}
......@@ -319,7 +332,7 @@ int main(int argc, char ** argv)
break;
}
if (cert->toBeSigned.encryptionKey){
cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, ".ekey", NULL);
cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, EXT_EKEY, NULL);
if (_force){
remove(buf);
}
......@@ -337,7 +350,7 @@ int main(int argc, char ** argv)
}
}
cvstrncpy(buf, CERT_MAX_SIZE, _outPath, "/", _profileName, ".oer", NULL);
cvstrncpy(buf, CERT_MAX_SIZE, _outPath, "/", _profileName, EXT_CERT, NULL);
f = fopen(buf, "wb");
if (f == NULL){
perror(buf);
......@@ -375,7 +388,7 @@ static int is_P256CurvePoint_empty(EccP256CurvePoint_t* point)
}
return 1;
}
static void fill_curve_point_eccP256(EccP256CurvePoint_t* point, ecc_curve_id curveType, const char * keyPath)
static void fill_curve_point_eccP256(EccP256CurvePoint_t* point, ecc_curve_id curveType, char * keyPath)
{
void * key;
char x[32], y[32];
......@@ -384,6 +397,8 @@ static void fill_curve_point_eccP256(EccP256CurvePoint_t* point, ecc_curve_id cu
if (key == NULL){
key = ecc_key_gen(curveType);
ecc_key_private_save(key, keyPath, _outKeyFormat);
strcat(keyPath, EXT_PUB);
ecc_key_public_save(key, keyPath, _outKeyFormat);
}
ecc_key_public(key, x, y, &compressed_y);
OCTET_STRING_fromBuf(&point->choice.x_only, x, 32);
......@@ -410,7 +425,7 @@ static int is_P384CurvePoint_empty(EccP384CurvePoint_t* point){
return 1;
}
static void fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id curveType, const char * keyPath)
static void fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id curveType, char * keyPath)
{
void * key;
char x[48], y[48];
......@@ -419,6 +434,8 @@ static void fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id cu
if (key == NULL){
key = ecc_key_gen(curveType);
ecc_key_private_save(key, keyPath, _outKeyFormat);
strcat(keyPath, EXT_PUB);
ecc_key_public_save(key, keyPath, _outKeyFormat);
}
ecc_key_public(key, x, y, &compressed_y);
OCTET_STRING_fromBuf(&point->choice.x_only, x, 48);
......
......@@ -436,9 +436,6 @@
<ProjectReference Include="..\cshared\cshared.vcxproj">
<Project>{d5918b85-fa45-4f75-9b50-c2d3e34aba17}</Project>
</ProjectReference>
<ProjectReference Include="..\cxml\cxml.vcxproj">
<Project>{cbfc4bfa-fe7e-45fb-ae2f-2608b7c0ad07}</Project>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{17B446F1-6962-4B49-8A59-4584807F9024}</ProjectGuid>
......@@ -471,13 +468,13 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)build\msvc\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\msvc\$(Configuration)\$(ProjectName)\</IntDir>
<OutDir>$(ProjectDir)..\build\msvc\$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)..\build\msvc\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)build\msvc\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\msvc\$(Configuration)\$(ProjectName)\</IntDir>
<OutDir>$(ProjectDir)..\build\msvc\$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)..\build\msvc\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
......
// Found in DeSmuME
// Alexis modified it a tad bit so it would compile as C (opposed to C++)
/* lib/mkgmtime.c
Copyright (C) 2010 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//Taken from newlib 1.18.0 which is licensed under GPL 2 and modified for desmume
/*
* mktime.c
* Original Author: G. Haley
*
* Converts the broken-down time, expressed as local time, in the structure
* pointed to by tim_p into a calendar time value. The original values of the
* tm_wday and tm_yday fields of the structure are ignored, and the original
* values of the other fields have no restrictions. On successful completion
* the fields of the structure are set to represent the specified calendar
* time. Returns the specified calendar time. If the calendar time can not be
* represented, returns the value (time_t) -1.
*
* Modifications: Fixed tm_isdst usage - 27 August 2008 Craig Howland.
*/
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "mkgmtime.h"
#define _SEC_IN_MINUTE 60L
#define _SEC_IN_HOUR 3600L
#define _SEC_IN_DAY 86400L
static const int DAYS_IN_MONTH[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
#define _DAYS_IN_MONTH(x) ((x == 1) ? days_in_feb : DAYS_IN_MONTH[x])
static const int _DAYS_BEFORE_MONTH[12] =
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
#define _ISLEAP(y) (((y) % 4) == 0 && (((y) % 100) != 0 || (((y)+1900) % 400) == 0))
#define _DAYS_IN_YEAR(year) (_ISLEAP(year) ? 366 : 365)
static void validate_structure(struct tm *tim_p)
{
div_t res;
int days_in_feb = 28;
/* calculate time & date to account for out of range values */
if (tim_p->tm_sec < 0 || tim_p->tm_sec > 59)
{
res = div (tim_p->tm_sec, 60);
tim_p->tm_min += res.quot;
if ((tim_p->tm_sec = res.rem) < 0)
{
tim_p->tm_sec += 60;
--tim_p->tm_min;
}
}
if (tim_p->tm_min < 0 || tim_p->tm_min > 59)
{
res = div (tim_p->tm_min, 60);
tim_p->tm_hour += res.quot;
if ((tim_p->tm_min = res.rem) < 0)
{
tim_p->tm_min += 60;
--tim_p->tm_hour;
}
}
if (tim_p->tm_hour < 0 || tim_p->tm_hour > 23)
{
res = div (tim_p->tm_hour, 24);
tim_p->tm_mday += res.quot;
if ((tim_p->tm_hour = res.rem) < 0)
{
tim_p->tm_hour += 24;
--tim_p->tm_mday;
}
}
if (tim_p->tm_mon > 11)
{
res = div (tim_p->tm_mon, 12);
tim_p->tm_year += res.quot;
if ((tim_p->tm_mon = res.rem) < 0)
{
tim_p->tm_mon += 12;
--tim_p->tm_year;
}
}
if (_DAYS_IN_YEAR (tim_p->tm_year) == 366)
days_in_feb = 29;
if (tim_p->tm_mday <= 0)
{
while (tim_p->tm_mday <= 0)
{
if (--tim_p->tm_mon == -1)
{
tim_p->tm_year--;
tim_p->tm_mon = 11;
days_in_feb =
((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ?
29 : 28);
}
tim_p->tm_mday += _DAYS_IN_MONTH (tim_p->tm_mon);
}
}
else
{
while (tim_p->tm_mday > _DAYS_IN_MONTH (tim_p->tm_mon))
{
tim_p->tm_mday -= _DAYS_IN_MONTH (tim_p->tm_mon);
if (++tim_p->tm_mon == 12)
{
tim_p->tm_year++;
tim_p->tm_mon = 0;
days_in_feb =
((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ?
29 : 28);
}
}
}
}
static const unsigned long _leap_moments[] = {
1136073600,
1230768000,
1341100800,
1435708800,
};
time_t addleapseconds(time_t t)
{
int i;
for (i = 0; i < sizeof(_leap_moments) / sizeof(_leap_moments[0]); i++){
if (t < _leap_moments[i]) break;
}
return t + i;
}
time_t removeleapseconds(time_t t)
{
int i;
for (i = 0; i < sizeof(_leap_moments) / sizeof(_leap_moments[0]); i++){
if (t < _leap_moments[i]) break;
t--;
}
return t;
}
#define ITS_UTC_EPOCH 1072915200
unsigned long mkitstime32(struct tm *tim_p)
{
time_t ret = mktaitime(tim_p);
if (ret > 0){
ret -= ITS_UTC_EPOCH;
}
return (unsigned long)ret;
}
unsigned long long mkitstime64(struct tm *tim_p)
{
unsigned long long ret = mktaitime64(tim_p);
if (ret > 0){
ret -= ((unsigned long long)ITS_UTC_EPOCH) * 1000;
}
return ret;
}
time_t mktaitime(struct tm *tim_p)
{
time_t t = mkgmtime(tim_p);
if (t >= 0){
t = addleapseconds(t);
}
return t;
}
unsigned long long mktaitime64(struct tm *tim_p)
{
time_t t = mkgmtime(tim_p);
if (t >= 0){
t = addleapseconds(t);
}
return ((unsigned long long)t)*1000;
}
unsigned long unix2itstime32(time_t t)
{
return ((unsigned long) addleapseconds(t)) - ITS_UTC_EPOCH;
}
unsigned long long unix2itstime64(time_t t)
{
return (((unsigned long long) addleapseconds(t)) - ITS_UTC_EPOCH) * 1000;
}
static char _datebuf[8][16];
static int _datebufidx = 0;
const char * strgmtdate(time_t t)
{
struct tm * tm;
char * b = _datebuf[_datebufidx];
_datebufidx = (_datebufidx + 1) & 7;
tm = gmtime(&t);
sprintf(b, "%u-%02u-%02u", 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday);
return b;
}
const char * strtaidate(time_t t)
{
return strgmtdate(removeleapseconds(t));
}
const char * stritsdate32(time_t t)
{
return strtaidate(t + ITS_UTC_EPOCH);
}
time_t mkgmtime(struct tm *tim_p)
{
time_t tim = 0;
long days = 0;
int year, isdst, tm_isdst;
/* validate structure */
validate_structure (tim_p);
/* compute hours, minutes, seconds */
tim += tim_p->tm_sec + (tim_p->tm_min * _SEC_IN_MINUTE) +
(tim_p->tm_hour * _SEC_IN_HOUR);
/* compute days in year */
days += tim_p->tm_mday - 1;
days += _DAYS_BEFORE_MONTH[tim_p->tm_mon];
if (tim_p->tm_mon > 1 && _DAYS_IN_YEAR (tim_p->tm_year) == 366)
days++;
/* compute day of the year */
tim_p->tm_yday = days;
if (tim_p->tm_year > 10000
|| tim_p->tm_year < -10000)
{
return (time_t) -1;
}
/* compute days in other years */
if (tim_p->tm_year > 70)
{
for (year = 70; year < tim_p->tm_year; year++)
days += _DAYS_IN_YEAR (year);
}
else if (tim_p->tm_year < 70)
{
for (year = 69; year > tim_p->tm_year; year--)
days -= _DAYS_IN_YEAR (year);
days -= _DAYS_IN_YEAR (year);
}
/* compute day of the week */
if ((tim_p->tm_wday = (days + 4) % 7) < 0)
tim_p->tm_wday += 7;
/* compute total seconds */
tim += (days * _SEC_IN_DAY);
/* Convert user positive into 1 */
tm_isdst = tim_p->tm_isdst > 0 ? 1 : tim_p->tm_isdst;
isdst = tm_isdst;
//screw this!
// if (_daylight)
// {
// int y = tim_p->tm_year + YEAR_BASE;
// if (y == tz->__tzyear || __tzcalc_limits (y))
//{
// /* calculate start of dst in dst local time and
// start of std in both std local time and dst local time */
// time_t startdst_dst = tz->__tzrule[0].change
// - (time_t) tz->__tzrule[1].offset;
// time_t startstd_dst = tz->__tzrule[1].change
// - (time_t) tz->__tzrule[1].offset;
// time_t startstd_std = tz->__tzrule[1].change
// - (time_t) tz->__tzrule[0].offset;
// /* if the time is in the overlap between dst and std local times */
// if (tim >= startstd_std && tim < startstd_dst)
// ; /* we let user decide or leave as -1 */
// else
// {
// isdst = (tz->__tznorth
// ? (tim >= startdst_dst && tim < startstd_std)
// : (tim >= startdst_dst || tim < startstd_std));
// /* if user committed and was wrong, perform correction, but not
// * if the user has given a negative value (which
// * asks mktime() to determine if DST is in effect or not) */
// if (tm_isdst >= 0 && (isdst ^ tm_isdst) == 1)
// {
// /* we either subtract or add the difference between
// time zone offsets, depending on which way the user got it
// wrong. The diff is typically one hour, or 3600 seconds,
// and should fit in a 16-bit int, even though offset
// is a long to accomodate 12 hours. */
// int diff = (int) (tz->__tzrule[0].offset
// - tz->__tzrule[1].offset);
// if (!isdst)
// diff = -diff;
// tim_p->tm_sec += diff;
// validate_structure (tim_p);
// tim += diff; /* we also need to correct our current time calculation */
// }
// }
//}
// }
//screw this also
/* add appropriate offset to put time in gmt format */
//if (isdst == 1)
// tim += (time_t) tz->__tzrule[1].offset;
//else /* otherwise assume std time */
// tim += (time_t) tz->__tzrule[0].offset;
//and screw this too
/* reset isdst flag to what we have calculated */
tim_p->tm_isdst = isdst;
return tim;
}
// vim: ts=2 sw=2 et
/* lib/mkgmtime.h
Copyright (C) 2010 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _MKGMTIME_H_
#define _MKGMTIME_H_
#include <time.h>
#ifdef __cplusplus
extern "C" {
#endif
extern time_t mkgmtime(struct tm *tim_p);
extern time_t mktaitime(struct tm *tim_p);
extern time_t addleapseconds(time_t t);
#define mktaitime32(X) ((unsigned long)mktaitime(X))
extern unsigned long mkitstime32(struct tm *tim_p);
extern unsigned long unix2itstime32(time_t t);
extern unsigned long long mktaitime64(struct tm *tim_p);
extern unsigned long long mkitstime64(struct tm *tim_p);
extern unsigned long long unix2itstime64(time_t t);
extern const char * stritsdate32(time_t t);
extern const char * strtaidate(time_t t);
extern const char * strgmtdate(time_t t);
#ifdef __cplusplus
}
#endif
#endif
//_MKGMTIME_H_
......@@ -11,10 +11,13 @@ ALL_CONFIGURATIONS := POSIX WIN32
ifeq ($(ARCH),)
ARCH = $(shell gcc -dumpmachine)
GCC := gcc
GCC := gcc
GPP := g++
else
GCC := $(addprefix $(addsuffix -,$(ARCH)), gcc)
GCC := $(addprefix $(addsuffix -,$(ARCH)), gcc)
GPP := $(addprefix $(addsuffix -,$(ARCH)), g++)
endif
LINK := $(GCC)
ifneq ($(findstring w32,$(ARCH)),)
packages := $(filter-out readline threads, $(packages))
......@@ -99,14 +102,22 @@ predirs += $(foreach cfg,$(CFG),$(predirs-$(cfg)))
postdirs += $(foreach cfg,$(CFG),$(postdirs-$(cfg)))
tests := $(addprefix $(addsuffix /,$(testdir)),$(tests))
sources := $(addprefix $(addsuffix /,$(srcdir)),$(sources))
sources := $(addprefix $(addsuffix /,$(srcdir)),$(sources))
csources := $(filter %.c, $(sources))
ccsources := $(filter %.cc, $(sources))
cppsources := $(filter %.cpp, $(sources))
headers := $(addprefix $(addsuffix /,$(incdir)),$(headers))
cflags += $(addprefix -I, $(includes)) $(addprefix -D, $(defines))
outdir := $(BUILDROOT)/$(ARCH)$(dsuffix)
objdir := $(outdir)/o-$(PROJECT)
objects := $(patsubst %.c, $(objdir)/%.o, $(sources))
cobjects := $(patsubst %.c, $(objdir)/%.o, $(csources))
ccobjects := $(patsubst %.cc, $(objdir)/%.o, $(ccsources))
objects := $(cobjects) $(ccobjects) $(cppobjects)
testbins := $(patsubst %.c, $(outdir)/%, $(tests))
dirs := $(objdir) $(outdir)/tests
......@@ -124,6 +135,9 @@ ifneq ($(filter cshared, $(packages)),)
libs += $(outdir)/libcshared.a
endif
ifneq (,$(sort $(ccobjects) $(cppobjects)))
LINK := $(GPP)
endif
all: $(dirs) $(predirs) $(alibnames) $(solibnames) $(binnames) $(postdirs)
......@@ -136,22 +150,30 @@ $(alibnames): $(outdir)/lib%.a : $(objects)
ar rcs $@ $^
$(solibnames): $(outdir)/lib%.so : $(objects)
$(GCC) $(cflags) -shared $(ldflags) -o $@ $^ $(csharedlib) $(libs)
$(LINK) $(cflags) -shared $(ldflags) -o $@ $^ $(csharedlib) $(libs)
$(binnames): $(outdir)/% : $(objects)
$(GCC) $(cflags) $(ldflags) -o $@ $^ $(csharedlib) $(libs)
$(LINK) $(cflags) $(ldflags) -o $@ $^ $(csharedlib) $(libs)
$(testbins): $(alibnames)
$(testbins): $(outdir)/tests/% : tests/%.c
$(GCC) $(cflags) -o $@ $< $(alibnames) $(libs)
$(LINK) $(cflags) -o $@ $< $(alibnames) $(libs)
$(dirs):
mkdir -p $@
$(objects): $(objdir)/%.o: %.c
$(cobjects): $(objdir)/%.o: %.c
@mkdir -p $(dir $@)