| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | ! 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 | 
					
						
							| 
									
										
										
										
											2009-09-17 23:07:21 -04:00
										 |  |  |        alien.c-types alien.destructors alien.data ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | IN: ecdsa | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  | TUPLE: ec-key handle ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  | M: ec-key dispose | 
					
						
							|  |  |  |     [ EC_KEY_free f ] change-handle drop ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <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* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  | DESTRUCTOR: BN_clear_free | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  | DESTRUCTOR: EC_POINT_clear_free | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  |     dup length f BN_bin2bn dup ssl-error | 
					
						
							|  |  |  |     [ &BN_clear_free EC_KEY_set_private_key ssl-error ] with-destructors ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | :: set-public-key ( BIN -- )
 | 
					
						
							|  |  |  |     ec-key-handle :> KEY | 
					
						
							|  |  |  |     KEY EC_KEY_get0_group :> GROUP | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  |     GROUP EC_POINT_new dup ssl-error | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  |         &EC_POINT_clear_free :> POINT | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  |         GROUP POINT BIN dup length f EC_POINT_oct2point ssl-error | 
					
						
							|  |  |  |         KEY POINT EC_KEY_set_public_key ssl-error | 
					
						
							| 
									
										
										
										
											2009-03-13 15:29:48 -04:00
										 |  |  |     ] with-destructors ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : get-private-key ( -- bin/f )
 | 
					
						
							|  |  |  |     ec-key-handle EC_KEY_get0_private_key | 
					
						
							| 
									
										
										
										
											2009-11-05 23:22:21 -05:00
										 |  |  |     dup [ dup BN_num_bits bits>bytes <byte-array> [ BN_bn2bin drop ] keep ] when ;
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | :: get-public-key ( -- bin/f )
 | 
					
						
							|  |  |  |     ec-key-handle :> KEY | 
					
						
							|  |  |  |     KEY EC_KEY_get0_public_key dup  | 
					
						
							|  |  |  |     [| PUB | | 
					
						
							|  |  |  |         KEY EC_KEY_get0_group :> GROUP | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |         GROUP EC_GROUP_get_degree bits>bytes 1 + :> LEN | 
					
						
							| 
									
										
										
										
											2009-03-09 16:33:20 -04:00
										 |  |  |         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 -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     ec-key-handle [ 0 -rot [ dup length ] bi@ ] dip ECDSA_verify 0 > ;
 |