ECDSA OpenSSL interface
parent
5aba91a0c5
commit
04c29c0a97
|
@ -1,4 +1,4 @@
|
|||
! Copyright (C) 2007 Elie CHAFTARI
|
||||
! Copyright (C) 2007 Elie CHAFTARI, 2009 Maxim Savchenko
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
!
|
||||
! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
|
||||
|
@ -159,3 +159,65 @@ FUNCTION: int RSA_check_key ( void* rsa ) ;
|
|||
FUNCTION: void RSA_free ( void* rsa ) ;
|
||||
|
||||
FUNCTION: int RSA_print_fp ( void* fp, void* x, int offset ) ;
|
||||
|
||||
! ===============================================
|
||||
! objects.h
|
||||
! ===============================================
|
||||
|
||||
FUNCTION: int OBJ_sn2nid ( char* s ) ;
|
||||
|
||||
! ===============================================
|
||||
! bn.h
|
||||
! ===============================================
|
||||
|
||||
FUNCTION: int BN_num_bits ( void* a ) ;
|
||||
|
||||
FUNCTION: void* BN_bin2bn ( void* s, int len, void* ret ) ;
|
||||
|
||||
FUNCTION: int BN_bn2bin ( void* a, void* to ) ;
|
||||
|
||||
FUNCTION: void BN_clear_free ( void* a ) ;
|
||||
|
||||
! ===============================================
|
||||
! ec.h
|
||||
! ===============================================
|
||||
|
||||
CONSTANT: POINT_CONVERSION_COMPRESSED 2
|
||||
CONSTANT: POINT_CONVERSION_UNCOMPRESSED 4
|
||||
CONSTANT: POINT_CONVERSION_HYBRID 6
|
||||
|
||||
FUNCTION: int EC_GROUP_get_degree ( void* group ) ;
|
||||
|
||||
FUNCTION: void* EC_POINT_new ( void* group ) ;
|
||||
|
||||
FUNCTION: void EC_POINT_clear_free ( void* point ) ;
|
||||
|
||||
FUNCTION: int EC_POINT_point2oct ( void* group, void* point, int form, void* buf, int len, void* ctx ) ;
|
||||
|
||||
FUNCTION: int EC_POINT_oct2point ( void* group, void* point, void* buf, int len, void* ctx ) ;
|
||||
|
||||
FUNCTION: void* EC_KEY_new_by_curve_name ( int nid ) ;
|
||||
|
||||
FUNCTION: void EC_KEY_free ( void* r ) ;
|
||||
|
||||
FUNCTION: int EC_KEY_set_private_key ( void* key, void* priv_key ) ;
|
||||
|
||||
FUNCTION: int EC_KEY_set_public_key ( void* key, void* pub_key ) ;
|
||||
|
||||
FUNCTION: int EC_KEY_generate_key ( void* eckey ) ;
|
||||
|
||||
FUNCTION: void* EC_KEY_get0_group ( void* key ) ;
|
||||
|
||||
FUNCTION: void* EC_KEY_get0_private_key ( void* key ) ;
|
||||
|
||||
FUNCTION: void* EC_KEY_get0_public_key ( void* key ) ;
|
||||
|
||||
! ===============================================
|
||||
! ecdsa.h
|
||||
! ===============================================
|
||||
|
||||
FUNCTION: int ECDSA_size ( void* eckey ) ;
|
||||
|
||||
FUNCTION: int ECDSA_sign ( int type, void* dgst, int dgstlen, void* sig, void* siglen, void* eckey ) ;
|
||||
|
||||
FUNCTION: int ECDSA_verify ( int type, void* dgst, int dgstlen, void* sig, int siglen, void* eckey ) ;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Maxim Savchenko
|
|
@ -0,0 +1,30 @@
|
|||
! Copyright (C) 2009 Maxim Savchenko
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
|
||||
USING: namespaces ecdsa tools.test checksums checksums.openssl ;
|
||||
IN: ecdsa.tests
|
||||
|
||||
SYMBOLS: priv-key pub-key signature ;
|
||||
|
||||
: message ( -- msg ) "Hello world!" ;
|
||||
|
||||
[ ] ! Generating keys
|
||||
[
|
||||
"prime256v1" [ generate-key get-private-key get-public-key ] with-ec
|
||||
pub-key set priv-key set
|
||||
] unit-test
|
||||
|
||||
[ ] ! Signing message
|
||||
[
|
||||
message "sha256" <openssl-checksum> checksum-bytes
|
||||
priv-key get
|
||||
"prime256v1" [ set-private-key ecdsa-sign ] with-ec
|
||||
signature set
|
||||
] unit-test
|
||||
|
||||
[ t ] ! Verifying signature
|
||||
[
|
||||
message "sha256" <openssl-checksum> checksum-bytes
|
||||
signature get pub-key get
|
||||
"prime256v1" [ set-public-key ecdsa-verify ] with-ec
|
||||
] unit-test
|
|
@ -0,0 +1,86 @@
|
|||
! Copyright (C) 2009 Maxim Savchenko
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
|
||||
USING: kernel accessors sequences sequences.private destructors math namespaces
|
||||
locals openssl openssl.libcrypto byte-arrays bit-arrays.private
|
||||
alien.c-types ;
|
||||
|
||||
IN: ecdsa
|
||||
|
||||
<PRIVATE
|
||||
|
||||
TUPLE: openssl-object handle ;
|
||||
|
||||
GENERIC# free-handle 1 ( obj handle -- obj )
|
||||
|
||||
M: openssl-object dispose
|
||||
dup [ free-handle f ] change-handle 2drop ;
|
||||
|
||||
TUPLE: ec-key < openssl-object ;
|
||||
|
||||
M: ec-key free-handle EC_KEY_free ;
|
||||
|
||||
: <ec-key> ( curve -- key )
|
||||
OBJ_sn2nid dup zero? [ "Unknown curve name" throw ] when
|
||||
EC_KEY_new_by_curve_name dup ssl-error ec-key boa ;
|
||||
|
||||
: ec-key-handle ( -- handle )
|
||||
ec-key get dup handle>> [ nip ] [ already-disposed ] if* ;
|
||||
|
||||
TUPLE: openssl-bignum < openssl-object ;
|
||||
|
||||
M: openssl-bignum free-handle BN_clear_free ;
|
||||
|
||||
TUPLE: ec-point < openssl-object ;
|
||||
|
||||
M: ec-point free-handle EC_POINT_clear_free ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: with-ec ( curve quot -- )
|
||||
swap <ec-key> [ ec-key rot with-variable ] with-disposal ; inline
|
||||
|
||||
: generate-key ( -- )
|
||||
ec-key get handle>> EC_KEY_generate_key ssl-error ;
|
||||
|
||||
: set-private-key ( bin -- )
|
||||
ec-key-handle swap
|
||||
dup length f BN_bin2bn dup ssl-error dup openssl-bignum boa
|
||||
[ drop EC_KEY_set_private_key ssl-error ] with-disposal ;
|
||||
|
||||
:: set-public-key ( BIN -- )
|
||||
ec-key-handle :> KEY
|
||||
KEY EC_KEY_get0_group :> GROUP
|
||||
GROUP EC_POINT_new dup ssl-error :> POINT
|
||||
POINT ec-point boa
|
||||
[
|
||||
drop
|
||||
GROUP POINT BIN dup length f EC_POINT_oct2point ssl-error
|
||||
KEY POINT EC_KEY_set_public_key ssl-error
|
||||
] with-disposal ;
|
||||
|
||||
: get-private-key ( -- bin/f )
|
||||
ec-key-handle EC_KEY_get0_private_key
|
||||
dup [ dup BN_num_bits bits>bytes <byte-array> tuck BN_bn2bin drop ] when ;
|
||||
|
||||
:: get-public-key ( -- bin/f )
|
||||
ec-key-handle :> KEY
|
||||
KEY EC_KEY_get0_public_key dup
|
||||
[| PUB |
|
||||
KEY EC_KEY_get0_group :> GROUP
|
||||
GROUP EC_GROUP_get_degree bits>bytes 1+ :> LEN
|
||||
LEN <byte-array> :> BIN
|
||||
GROUP PUB POINT_CONVERSION_COMPRESSED BIN LEN f
|
||||
EC_POINT_point2oct ssl-error
|
||||
BIN
|
||||
] when ;
|
||||
|
||||
:: ecdsa-sign ( DGST -- sig )
|
||||
ec-key-handle :> KEY
|
||||
KEY ECDSA_size dup ssl-error <byte-array> :> SIG
|
||||
"uint" <c-object> :> LEN
|
||||
0 DGST dup length SIG LEN KEY ECDSA_sign ssl-error
|
||||
LEN *uint SIG resize ;
|
||||
|
||||
: ecdsa-verify ( dgst sig -- ? )
|
||||
ec-key-handle [ 0 -rot [ dup length ] bi@ ] dip ECDSA_verify 0 > ;
|
|
@ -0,0 +1 @@
|
|||
Elliptic Curve Digital Signature Algorithm (OpenSSL realisation)
|
Loading…
Reference in New Issue