kopia lustrzana https://github.com/conorpp/u2f-zero
Merge branch 'master' of https://github.com/conorpp/u2f-zero
commit
be8e116804
|
@ -40,3 +40,4 @@ gerbers/*
|
|||
|
||||
# simplicity studio
|
||||
firmware/Keil*
|
||||
*.swp
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
src = $(wildcard *.c)
|
||||
obj = $(src:.c=.o)
|
||||
|
||||
LDFLAGS = -lcrypto
|
||||
|
||||
verify: $(obj)
|
||||
$(CC) -O3 -Wall -Werror -o $@ $^ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f $(obj) verify
|
|
@ -9,48 +9,105 @@
|
|||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
void verify(char * digest, char * pubxy, char * rs )
|
||||
int verify(char * digest, char * pubxy, char * rs )
|
||||
{
|
||||
EC_KEY * key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
|
||||
|
||||
ECDSA_SIG sig;
|
||||
BIGNUM* bnx, *bny;
|
||||
BIGNUM * bnx = NULL, * bny = NULL;
|
||||
|
||||
char r[65], s[65], x[65], y[65];
|
||||
|
||||
memmove(x, pubxy, 64);
|
||||
memmove(y, pubxy+64, 64);
|
||||
memmove(r, rs, 64);
|
||||
memmove(s, rs+64, 64);
|
||||
memset(&sig, 0, sizeof(ECDSA_SIG));
|
||||
|
||||
r[64] = s[64] = x[64] = y[64] = 0;
|
||||
|
||||
if (!BN_hex2bn(&bnx, x))
|
||||
{ return -1; }
|
||||
if (!BN_hex2bn(&bny, y))
|
||||
{ return -1; }
|
||||
|
||||
bnx = BN_new();
|
||||
bny = BN_new();
|
||||
sig.r = BN_new();
|
||||
sig.s = BN_new();
|
||||
|
||||
BN_hex2bn(&bnx, x);
|
||||
BN_hex2bn(&bny, y);
|
||||
|
||||
|
||||
BN_hex2bn(&sig.r, r);
|
||||
BN_hex2bn(&sig.s, s);
|
||||
|
||||
assert(key != NULL);
|
||||
assert(bny != NULL);
|
||||
assert(bnx != NULL);
|
||||
if (!BN_hex2bn(&sig.r, r))
|
||||
{ return -1; }
|
||||
if (!BN_hex2bn(&sig.s, s))
|
||||
{ return -1; }
|
||||
|
||||
if (!EC_KEY_set_public_key_affine_coordinates(key,bnx,bny))
|
||||
{
|
||||
fprintf(stderr,"set key affine coords failed\n");
|
||||
fprintf(stderr," %s\n", ERR_error_string(ERR_get_error(),NULL) );
|
||||
return;
|
||||
}
|
||||
{ return -1; }
|
||||
|
||||
int ret = ECDSA_do_verify(digest, SHA256_DIGEST_LENGTH, &sig, key);
|
||||
|
||||
EC_KEY_free(key);
|
||||
BN_free(bnx);
|
||||
BN_free(bny);
|
||||
BN_free(sig.r);
|
||||
BN_free(sig.s);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
|
||||
char buf[256], c;
|
||||
char digest[SHA256_DIGEST_LENGTH];
|
||||
int take_digest = 1;
|
||||
|
||||
SHA256_CTX sha256;
|
||||
int n, ret;
|
||||
|
||||
char * pubkey, * sig;
|
||||
|
||||
if (argc != 3 && argc != 4)
|
||||
{
|
||||
fprintf(stderr, "usage: %s <public-key-hex> <signature-hex> [-d]\n"
|
||||
" -d: don't take sha256sum of stdin input\n",argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ERR_load_crypto_strings();
|
||||
|
||||
pubkey = argv[1];
|
||||
sig = argv[2];
|
||||
|
||||
while ( (c = getopt(argc, argv, "d") ) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'd':
|
||||
take_digest = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (take_digest)
|
||||
{
|
||||
SHA256_Init(&sha256);
|
||||
|
||||
while ((n = read(STDIN_FILENO, buf, sizeof(buf)))>0)
|
||||
{
|
||||
SHA256_Update(&sha256, buf, n);
|
||||
}
|
||||
|
||||
SHA256_Final(digest, &sha256);
|
||||
}
|
||||
else
|
||||
{
|
||||
read(STDIN_FILENO, digest, sizeof(digest));
|
||||
}
|
||||
|
||||
ret = verify(digest,
|
||||
pubkey,
|
||||
sig);
|
||||
|
||||
switch(ret)
|
||||
{
|
||||
case -1:
|
||||
|
@ -64,51 +121,6 @@ void verify(char * digest, char * pubxy, char * rs )
|
|||
break;
|
||||
}
|
||||
|
||||
EC_KEY_free(key);
|
||||
BN_free(bnx);
|
||||
BN_free(bny);
|
||||
BN_free(sig.r);
|
||||
BN_free(sig.s);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
|
||||
char buf[64];
|
||||
char digest_bin[SHA256_DIGEST_LENGTH];
|
||||
SHA256_CTX sha256;
|
||||
int n;
|
||||
|
||||
char * pubkey, * sig;
|
||||
|
||||
if (argc != 3)
|
||||
{
|
||||
fprintf(stderr, "usage: %s <public-key-hex> <signature-hex>\n",argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pubkey = argv[1];
|
||||
sig = argv[2];
|
||||
|
||||
SHA256_Init(&sha256);
|
||||
|
||||
while ((n = read(STDIN_FILENO, buf, sizeof(buf)))>0)
|
||||
{
|
||||
SHA256_Update(&sha256, buf, n);
|
||||
}
|
||||
|
||||
SHA256_Final(digest_bin, &sha256);
|
||||
|
||||
//BIGNUM* bnd = BN_bin2bn(digest_bin, SHA256_DIGEST_LENGTH, NULL);
|
||||
//char * digest = BN_bn2hex(bnd);
|
||||
|
||||
verify(digest_bin,
|
||||
pubkey,
|
||||
sig);
|
||||
|
||||
//BN_free(bnd);
|
||||
//OPENSSL_free(digest);
|
||||
|
||||
ERR_free_strings();
|
||||
return 0;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue