mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Expose the key-file marshalling functions in testcrypt.
This will allow me to write tests for them.
This commit is contained in:
parent
9cc586e605
commit
5cfc90ff0d
4
Recipe
4
Recipe
@ -392,9 +392,9 @@ osxlaunch : [UT] osxlaunch
|
|||||||
|
|
||||||
fuzzterm : [UT] UXTERM CHARSET MISC version uxmisc uxucs fuzzterm time settings
|
fuzzterm : [UT] UXTERM CHARSET MISC version uxmisc uxucs fuzzterm time settings
|
||||||
+ uxstore be_none uxnogtk memory
|
+ uxstore be_none uxnogtk memory
|
||||||
testcrypt : [UT] testcrypt SSHCRYPTO sshprng sshprime marshal utils
|
testcrypt : [UT] testcrypt SSHCRYPTO sshprng sshprime sshpubk marshal utils
|
||||||
+ memory tree234 uxutils KEYGEN
|
+ memory tree234 uxutils KEYGEN
|
||||||
testcrypt : [C] testcrypt SSHCRYPTO sshprng sshprime marshal utils
|
testcrypt : [C] testcrypt SSHCRYPTO sshprng sshprime sshpubk marshal utils
|
||||||
+ memory tree234 winmiscs KEYGEN
|
+ memory tree234 winmiscs KEYGEN
|
||||||
testsc : [UT] testsc SSHCRYPTO marshal utils memory tree234 wildcard
|
testsc : [UT] testsc SSHCRYPTO marshal utils memory tree234 wildcard
|
||||||
+ sshmac uxutils
|
+ sshmac uxutils
|
||||||
|
122
testcrypt.c
122
testcrypt.c
@ -48,6 +48,12 @@ static NORETURN void fatal_error(const char *p, ...)
|
|||||||
|
|
||||||
void out_of_memory(void) { fatal_error("out of memory"); }
|
void out_of_memory(void) { fatal_error("out of memory"); }
|
||||||
|
|
||||||
|
FILE *f_open(const struct Filename *fn, char const *mode, bool private)
|
||||||
|
{ unreachable("f_open should never be called by this test program"); }
|
||||||
|
|
||||||
|
static bool old_keyfile_warning_given;
|
||||||
|
void old_keyfile_warning(void) { old_keyfile_warning_given = true; }
|
||||||
|
|
||||||
static bufchain random_data_queue;
|
static bufchain random_data_queue;
|
||||||
void random_read(void *buf, size_t size)
|
void random_read(void *buf, size_t size)
|
||||||
{
|
{
|
||||||
@ -118,6 +124,8 @@ struct Value {
|
|||||||
#define VALTYPE_UNION(n,t,f) t vu_##n;
|
#define VALTYPE_UNION(n,t,f) t vu_##n;
|
||||||
VALUE_TYPES(VALTYPE_UNION)
|
VALUE_TYPES(VALTYPE_UNION)
|
||||||
#undef VALTYPE_UNION
|
#undef VALTYPE_UNION
|
||||||
|
|
||||||
|
char *bare_string;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -428,6 +436,14 @@ static char *get_val_string_asciz(BinarySource *in)
|
|||||||
return get_val_string(in)->s;
|
return get_val_string(in)->s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static strbuf *get_opt_val_string(BinarySource *in);
|
||||||
|
|
||||||
|
static char *get_opt_val_string_asciz(BinarySource *in)
|
||||||
|
{
|
||||||
|
strbuf *sb = get_opt_val_string(in);
|
||||||
|
return sb ? sb->s : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static mp_int **get_out_val_mpint(BinarySource *in)
|
static mp_int **get_out_val_mpint(BinarySource *in)
|
||||||
{
|
{
|
||||||
Value *val = value_new(VT_mpint);
|
Value *val = value_new(VT_mpint);
|
||||||
@ -457,6 +473,47 @@ static BinarySink *get_out_val_string_binarysink(BinarySource *in)
|
|||||||
return BinarySink_UPCAST(val->vu_string);
|
return BinarySink_UPCAST(val->vu_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void return_val_string_asciz_const(strbuf *out, const char *s);
|
||||||
|
static void return_val_string_asciz(strbuf *out, char *s);
|
||||||
|
|
||||||
|
static void finaliser_return_opt_string_asciz(strbuf *out, void *ctx)
|
||||||
|
{
|
||||||
|
char **valp = (char **)ctx;
|
||||||
|
char *val = *valp;
|
||||||
|
sfree(valp);
|
||||||
|
if (!val)
|
||||||
|
strbuf_catf(out, "NULL\n");
|
||||||
|
else
|
||||||
|
return_val_string_asciz(out, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char **get_out_opt_val_string_asciz(BinarySource *in)
|
||||||
|
{
|
||||||
|
char **valp = snew(char *);
|
||||||
|
*valp = NULL;
|
||||||
|
add_finaliser(finaliser_return_opt_string_asciz, valp);
|
||||||
|
return valp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void finaliser_return_opt_string_asciz_const(strbuf *out, void *ctx)
|
||||||
|
{
|
||||||
|
const char **valp = (const char **)ctx;
|
||||||
|
const char *val = *valp;
|
||||||
|
sfree(valp);
|
||||||
|
if (!val)
|
||||||
|
strbuf_catf(out, "NULL\n");
|
||||||
|
else
|
||||||
|
return_val_string_asciz_const(out, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char **get_out_opt_val_string_asciz_const(BinarySource *in)
|
||||||
|
{
|
||||||
|
const char **valp = snew(const char *);
|
||||||
|
*valp = NULL;
|
||||||
|
add_finaliser(finaliser_return_opt_string_asciz_const, valp);
|
||||||
|
return valp;
|
||||||
|
}
|
||||||
|
|
||||||
static void finaliser_sfree(strbuf *out, void *ctx)
|
static void finaliser_sfree(strbuf *out, void *ctx)
|
||||||
{
|
{
|
||||||
sfree(ctx);
|
sfree(ctx);
|
||||||
@ -495,14 +552,19 @@ static void return_boolean(strbuf *out, bool b)
|
|||||||
strbuf_catf(out, "%s\n", b ? "true" : "false");
|
strbuf_catf(out, "%s\n", b ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void return_val_string_asciz(strbuf *out, char *s)
|
static void return_val_string_asciz_const(strbuf *out, const char *s)
|
||||||
{
|
{
|
||||||
strbuf *sb = strbuf_new();
|
strbuf *sb = strbuf_new();
|
||||||
put_data(sb, s, strlen(s));
|
put_data(sb, s, strlen(s));
|
||||||
sfree(s);
|
|
||||||
return_val_string(out, sb);
|
return_val_string(out, sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void return_val_string_asciz(strbuf *out, char *s)
|
||||||
|
{
|
||||||
|
return_val_string_asciz_const(out, s);
|
||||||
|
sfree(s);
|
||||||
|
}
|
||||||
|
|
||||||
#define NULLABLE_RETURN_WRAPPER(type_name, c_type) \
|
#define NULLABLE_RETURN_WRAPPER(type_name, c_type) \
|
||||||
static void return_opt_##type_name(strbuf *out, c_type ptr) \
|
static void return_opt_##type_name(strbuf *out, c_type ptr) \
|
||||||
{ \
|
{ \
|
||||||
@ -908,6 +970,57 @@ bool crcda_detect(ptrlen packet, ptrlen iv)
|
|||||||
return toret;
|
return toret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssh_key *ppk_load_s_wrapper(BinarySource *src, char **comment,
|
||||||
|
const char *passphrase, const char **errorstr)
|
||||||
|
{
|
||||||
|
ssh2_userkey *uk = ppk_load_s(src, passphrase, errorstr);
|
||||||
|
if (uk == SSH2_WRONG_PASSPHRASE) {
|
||||||
|
/* Fudge this special return value */
|
||||||
|
*errorstr = "SSH2_WRONG_PASSPHRASE";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (uk == NULL)
|
||||||
|
return NULL;
|
||||||
|
ssh_key *toret = uk->key;
|
||||||
|
*comment = uk->comment;
|
||||||
|
sfree(uk);
|
||||||
|
return toret;
|
||||||
|
}
|
||||||
|
#define ppk_load_s ppk_load_s_wrapper
|
||||||
|
|
||||||
|
int rsa1_load_s_wrapper(BinarySource *src, RSAKey *rsa, char **comment,
|
||||||
|
const char *passphrase, const char **errorstr)
|
||||||
|
{
|
||||||
|
int toret = rsa1_load_s(src, rsa, passphrase, errorstr);
|
||||||
|
*comment = rsa->comment;
|
||||||
|
rsa->comment = NULL;
|
||||||
|
return toret;
|
||||||
|
}
|
||||||
|
#define rsa1_load_s rsa1_load_s_wrapper
|
||||||
|
|
||||||
|
strbuf *ppk_save_sb_wrapper(ssh_key *key, const char *comment,
|
||||||
|
const char *passphrase)
|
||||||
|
{
|
||||||
|
ssh2_userkey uk;
|
||||||
|
uk.key = key;
|
||||||
|
uk.comment = dupstr(comment);
|
||||||
|
strbuf *toret = ppk_save_sb(&uk, passphrase);
|
||||||
|
sfree(uk.comment);
|
||||||
|
return toret;
|
||||||
|
}
|
||||||
|
#define ppk_save_sb ppk_save_sb_wrapper
|
||||||
|
|
||||||
|
strbuf *rsa1_save_sb_wrapper(RSAKey *key, const char *comment,
|
||||||
|
const char *passphrase)
|
||||||
|
{
|
||||||
|
key->comment = dupstr(comment);
|
||||||
|
strbuf *toret = rsa1_save_sb(key, passphrase);
|
||||||
|
sfree(key->comment);
|
||||||
|
key->comment = NULL;
|
||||||
|
return toret;
|
||||||
|
}
|
||||||
|
#define rsa1_save_sb rsa1_save_sb_wrapper
|
||||||
|
|
||||||
#define return_void(out, expression) (expression)
|
#define return_void(out, expression) (expression)
|
||||||
|
|
||||||
static void no_progress(void *param, int action, int phase, int iprogress) {}
|
static void no_progress(void *param, int action, int phase, int iprogress) {}
|
||||||
@ -980,6 +1093,7 @@ VALUE_TYPES(VALTYPE_TYPEDEF)
|
|||||||
}
|
}
|
||||||
OPTIONAL_PTR_FUNC(cipher)
|
OPTIONAL_PTR_FUNC(cipher)
|
||||||
OPTIONAL_PTR_FUNC(mpint)
|
OPTIONAL_PTR_FUNC(mpint)
|
||||||
|
OPTIONAL_PTR_FUNC(string)
|
||||||
|
|
||||||
typedef uintmax_t TD_uint;
|
typedef uintmax_t TD_uint;
|
||||||
typedef ptrlen TD_val_string_ptrlen;
|
typedef ptrlen TD_val_string_ptrlen;
|
||||||
@ -987,6 +1101,10 @@ typedef char *TD_val_string_asciz;
|
|||||||
typedef BinarySource *TD_val_string_binarysource;
|
typedef BinarySource *TD_val_string_binarysource;
|
||||||
typedef unsigned *TD_out_uint;
|
typedef unsigned *TD_out_uint;
|
||||||
typedef BinarySink *TD_out_val_string_binarysink;
|
typedef BinarySink *TD_out_val_string_binarysink;
|
||||||
|
typedef const char *TD_opt_val_string_asciz;
|
||||||
|
typedef char **TD_out_val_string_asciz;
|
||||||
|
typedef char **TD_out_opt_val_string_asciz;
|
||||||
|
typedef const char **TD_out_opt_val_string_asciz_const;
|
||||||
typedef ssh_hash *TD_consumed_val_hash;
|
typedef ssh_hash *TD_consumed_val_hash;
|
||||||
typedef const ssh_hashalg *TD_hashalg;
|
typedef const ssh_hashalg *TD_hashalg;
|
||||||
typedef const ssh2_macalg *TD_macalg;
|
typedef const ssh2_macalg *TD_macalg;
|
||||||
|
13
testcrypt.h
13
testcrypt.h
@ -228,6 +228,19 @@ FUNC1(void, prng_seed_finish, val_prng)
|
|||||||
FUNC2(val_string, prng_read, val_prng, uint)
|
FUNC2(val_string, prng_read, val_prng, uint)
|
||||||
FUNC3(void, prng_add_entropy, val_prng, uint, val_string_ptrlen)
|
FUNC3(void, prng_add_entropy, val_prng, uint, val_string_ptrlen)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Key load/save functions, or rather, the BinarySource / strbuf API
|
||||||
|
* that sits just inside the file I/O versions.
|
||||||
|
*/
|
||||||
|
FUNC2(boolean, ppk_encrypted_s, val_string_binarysource, out_opt_val_string_asciz)
|
||||||
|
FUNC2(boolean, rsa1_encrypted_s, val_string_binarysource, out_opt_val_string_asciz)
|
||||||
|
FUNC5(boolean, ppk_loadpub_s, val_string_binarysource, out_opt_val_string_asciz, out_val_string_binarysink, out_opt_val_string_asciz, out_opt_val_string_asciz_const)
|
||||||
|
FUNC4(int, rsa1_loadpub_s, val_string_binarysource, out_val_string_binarysink, out_opt_val_string_asciz, out_opt_val_string_asciz_const)
|
||||||
|
FUNC4(opt_val_key, ppk_load_s, val_string_binarysource, out_opt_val_string_asciz, opt_val_string_asciz, out_opt_val_string_asciz_const)
|
||||||
|
FUNC5(int, rsa1_load_s, val_string_binarysource, val_rsa, out_opt_val_string_asciz, opt_val_string_asciz, out_opt_val_string_asciz_const)
|
||||||
|
FUNC3(val_string, ppk_save_sb, val_key, opt_val_string_asciz, opt_val_string_asciz)
|
||||||
|
FUNC3(val_string, rsa1_save_sb, val_rsa, opt_val_string_asciz, opt_val_string_asciz)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Key generation functions.
|
* Key generation functions.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user