2 * Copyright (C) 2004, 2005, 2006 Free Software Foundation
3 * Copyright (c) 2002 Andrew McDonald <andrew@mcdonald.org.uk>
5 * This file is part of GNUTLS-EXTRA.
7 * GNUTLS-EXTRA is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version.
12 * GNUTLS-EXTRA is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNUTLS-EXTRA; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26 #include <gnutls/gnutls.h>
27 #include <openssl_compat.h>
32 #include <gnutls/openssl.h>
34 /* XXX: See lib/gnutls_int.h. */
35 #define GNUTLS_POINTER_TO_INT(_) ((int) GNUTLS_POINTER_TO_INT_CAST (_))
36 #define GNUTLS_INT_TO_POINTER(_) ((void*) GNUTLS_POINTER_TO_INT_CAST (_))
38 /* WARNING: Error functions aren't currently thread-safe */
40 static int last_error
= 0;
43 /* Library initialisation functions */
46 SSL_library_init (void)
48 gnutls_global_init ();
49 /* NB: we haven't got anywhere to call gnutls_global_deinit() */
54 OpenSSL_add_all_algorithms (void)
59 /* SSL_CTX structure handling */
62 SSL_CTX_new (SSL_METHOD
* method
)
66 ctx
= (SSL_CTX
*) calloc (1, sizeof (SSL_CTX
));
73 SSL_CTX_free (SSL_CTX
* ctx
)
80 SSL_CTX_set_default_verify_paths (SSL_CTX
* ctx
)
86 SSL_CTX_use_certificate_file (SSL_CTX
* ctx
, const char *certfile
, int type
)
88 ctx
->certfile
= (char *) calloc (1, strlen (certfile
) + 1);
91 memcpy (ctx
->certfile
, certfile
, strlen (certfile
));
93 ctx
->certfile_type
= type
;
99 SSL_CTX_use_PrivateKey_file (SSL_CTX
* ctx
, const char *keyfile
, int type
)
101 ctx
->keyfile
= (char *) calloc (1, strlen (keyfile
) + 1);
104 memcpy (ctx
->keyfile
, keyfile
, strlen (keyfile
));
106 ctx
->keyfile_type
= type
;
113 SSL_CTX_set_verify (SSL_CTX
* ctx
, int verify_mode
,
114 int (*verify_callback
) (int, X509_STORE_CTX
*))
116 ctx
->verify_mode
= verify_mode
;
117 ctx
->verify_callback
= verify_callback
;
121 SSL_CTX_set_options (SSL_CTX
* ctx
, unsigned long options
)
123 return (ctx
->options
|= options
);
127 SSL_CTX_set_mode (SSL_CTX
* ctx
, long mode
)
133 SSL_CTX_set_cipher_list (SSL_CTX
* ctx
, const char *list
)
135 /* FIXME: ignore this for the moment */
136 /* We're going to have to parse the "list" string to do this */
137 /* It is a string, which in its simplest form is something like
138 "DES-CBC3-SHA:IDEA-CBC-MD5", but can be rather more complicated
139 (see OpenSSL's ciphers(1) manpage for details) */
145 /* SSL_CTX statistics */
148 SSL_CTX_sess_number (SSL_CTX
* ctx
)
154 SSL_CTX_sess_connect (SSL_CTX
* ctx
)
160 SSL_CTX_sess_connect_good (SSL_CTX
* ctx
)
166 SSL_CTX_sess_connect_renegotiate (SSL_CTX
* ctx
)
172 SSL_CTX_sess_accept (SSL_CTX
* ctx
)
178 SSL_CTX_sess_accept_good (SSL_CTX
* ctx
)
184 SSL_CTX_sess_accept_renegotiate (SSL_CTX
* ctx
)
190 SSL_CTX_sess_hits (SSL_CTX
* ctx
)
196 SSL_CTX_sess_misses (SSL_CTX
* ctx
)
202 SSL_CTX_sess_timeouts (SSL_CTX
* ctx
)
209 /* SSL structure handling */
212 SSL_new (SSL_CTX
* ctx
)
217 ssl
= (SSL
*) calloc (1, sizeof (SSL
));
221 err
= gnutls_certificate_allocate_credentials (&ssl
->gnutls_cred
);
229 gnutls_init (&ssl
->gnutls_state
, ctx
->method
->connend
);
231 gnutls_protocol_set_priority (ssl
->gnutls_state
,
232 ctx
->method
->protocol_priority
);
233 gnutls_cipher_set_priority (ssl
->gnutls_state
,
234 ctx
->method
->cipher_priority
);
235 gnutls_compression_set_priority (ssl
->gnutls_state
,
236 ctx
->method
->comp_priority
);
237 gnutls_kx_set_priority (ssl
->gnutls_state
, ctx
->method
->kx_priority
);
238 gnutls_mac_set_priority (ssl
->gnutls_state
, ctx
->method
->mac_priority
);
240 gnutls_credentials_set (ssl
->gnutls_state
, GNUTLS_CRD_CERTIFICATE
,
243 gnutls_certificate_set_x509_trust_file (ssl
->gnutls_cred
,
247 gnutls_certificate_set_x509_key_file (ssl
->gnutls_cred
,
248 ctx
->certfile
, ctx
->keyfile
,
251 ssl
->verify_mode
= ctx
->verify_mode
;
252 ssl
->verify_callback
= ctx
->verify_callback
;
254 ssl
->options
= ctx
->options
;
256 ssl
->rfd
= (gnutls_transport_ptr_t
) - 1;
257 ssl
->wfd
= (gnutls_transport_ptr_t
) - 1;
265 gnutls_certificate_free_credentials (ssl
->gnutls_cred
);
266 gnutls_deinit (ssl
->gnutls_state
);
271 SSL_load_error_strings (void)
276 SSL_get_error (SSL
* ssl
, int ret
)
279 return SSL_ERROR_NONE
;
281 return SSL_ERROR_ZERO_RETURN
;
285 SSL_set_fd (SSL
* ssl
, int fd
)
287 gnutls_transport_set_ptr (ssl
->gnutls_state
, GNUTLS_INT_TO_POINTER (fd
));
292 SSL_set_rfd (SSL
* ssl
, int fd
)
294 ssl
->rfd
= GNUTLS_INT_TO_POINTER (fd
);
296 if (ssl
->wfd
!= (gnutls_transport_ptr_t
) - 1)
297 gnutls_transport_set_ptr2 (ssl
->gnutls_state
, ssl
->rfd
, ssl
->wfd
);
303 SSL_set_wfd (SSL
* ssl
, int fd
)
305 ssl
->wfd
= GNUTLS_INT_TO_POINTER (fd
);
307 if (ssl
->rfd
!= (gnutls_transport_ptr_t
) - 1)
308 gnutls_transport_set_ptr2 (ssl
->gnutls_state
, ssl
->rfd
, ssl
->wfd
);
314 SSL_set_bio (SSL
* ssl
, BIO
* rbio
, BIO
* wbio
)
316 gnutls_transport_set_ptr2 (ssl
->gnutls_state
, rbio
->fd
, wbio
->fd
);
321 SSL_set_connect_state (SSL
* ssl
)
326 SSL_pending (SSL
* ssl
)
328 return gnutls_record_check_pending (ssl
->gnutls_state
);
332 SSL_set_verify (SSL
* ssl
, int verify_mode
,
333 int (*verify_callback
) (int, X509_STORE_CTX
*))
335 ssl
->verify_mode
= verify_mode
;
336 ssl
->verify_callback
= verify_callback
;
340 SSL_get_peer_certificate (SSL
* ssl
)
342 const gnutls_datum_t
*cert_list
;
343 int cert_list_size
= 0;
345 cert_list
= gnutls_certificate_get_peers (ssl
->gnutls_state
,
351 /* SSL connection open/close/read/write functions */
354 SSL_connect (SSL
* ssl
)
356 X509_STORE_CTX
*store
;
357 int cert_list_size
= 0;
360 int x_priority
[GNUTLS_MAX_ALGORITHM_NUM
];
361 /* take options into account before connecting */
363 memset (x_priority
, 0, sizeof (x_priority
));
364 if (ssl
->options
& SSL_OP_NO_TLSv1
)
367 i
< GNUTLS_MAX_ALGORITHM_NUM
&& x_priority
[i
] != 0; i
++, j
++)
369 if (ssl
->ctx
->method
->protocol_priority
[j
] == GNUTLS_TLS1
)
372 x_priority
[i
] = ssl
->ctx
->method
->protocol_priority
[j
];
374 if (i
< GNUTLS_MAX_ALGORITHM_NUM
)
376 gnutls_protocol_set_priority (ssl
->gnutls_state
,
377 ssl
->ctx
->method
->protocol_priority
);
380 err
= gnutls_handshake (ssl
->gnutls_state
);
381 ssl
->last_error
= err
;
389 store
= (X509_STORE_CTX
*) calloc (1, sizeof (X509_STORE_CTX
));
391 store
->cert_list
= gnutls_certificate_get_peers (ssl
->gnutls_state
,
394 if (ssl
->verify_callback
)
396 ssl
->verify_callback (1 /*FIXME*/, store
);
398 ssl
->state
= SSL_ST_OK
;
403 /* FIXME: deal with error from callback */
409 SSL_accept (SSL
* ssl
)
411 X509_STORE_CTX
*store
;
412 int cert_list_size
= 0;
415 int x_priority
[GNUTLS_MAX_ALGORITHM_NUM
];
416 /* take options into account before accepting */
418 memset (x_priority
, 0, sizeof (x_priority
));
419 if (ssl
->options
& SSL_OP_NO_TLSv1
)
422 i
< GNUTLS_MAX_ALGORITHM_NUM
&& x_priority
[i
] != 0; i
++, j
++)
424 if (ssl
->ctx
->method
->protocol_priority
[j
] == GNUTLS_TLS1
)
427 x_priority
[i
] = ssl
->ctx
->method
->protocol_priority
[j
];
429 if (i
< GNUTLS_MAX_ALGORITHM_NUM
)
431 gnutls_protocol_set_priority (ssl
->gnutls_state
,
432 ssl
->ctx
->method
->protocol_priority
);
435 /* FIXME: dh params, do we want client cert? */
437 err
= gnutls_handshake (ssl
->gnutls_state
);
438 ssl
->last_error
= err
;
446 store
= (X509_STORE_CTX
*) calloc (1, sizeof (X509_STORE_CTX
));
448 store
->cert_list
= gnutls_certificate_get_peers (ssl
->gnutls_state
,
451 if (ssl
->verify_callback
)
453 ssl
->verify_callback (1 /*FIXME*/, store
);
455 ssl
->state
= SSL_ST_OK
;
460 /* FIXME: deal with error from callback */
466 SSL_shutdown (SSL
* ssl
)
470 gnutls_bye (ssl
->gnutls_state
, GNUTLS_SHUT_WR
);
475 gnutls_bye (ssl
->gnutls_state
, GNUTLS_SHUT_RDWR
);
484 SSL_read (SSL
* ssl
, void *buf
, int len
)
488 ret
= gnutls_record_recv (ssl
->gnutls_state
, buf
, len
);
489 ssl
->last_error
= ret
;
501 SSL_write (SSL
* ssl
, const void *buf
, int len
)
505 ret
= gnutls_record_send (ssl
->gnutls_state
, buf
, len
);
506 ssl
->last_error
= ret
;
524 /* SSL_METHOD functions */
527 SSLv23_client_method (void)
530 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
534 m
->protocol_priority
[0] = GNUTLS_TLS1
;
535 m
->protocol_priority
[1] = GNUTLS_SSL3
;
536 m
->protocol_priority
[2] = 0;
538 m
->cipher_priority
[0] = GNUTLS_CIPHER_AES_128_CBC
;
539 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
540 m
->cipher_priority
[2] = GNUTLS_CIPHER_AES_256_CBC
;
541 m
->cipher_priority
[3] = GNUTLS_CIPHER_ARCFOUR_128
;
542 m
->cipher_priority
[4] = 0;
544 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
545 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
546 m
->comp_priority
[2] = 0;
548 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
549 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
550 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
551 m
->kx_priority
[3] = 0;
553 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
554 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
555 m
->mac_priority
[2] = 0;
557 m
->connend
= GNUTLS_CLIENT
;
563 SSLv23_server_method (void)
566 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
570 m
->protocol_priority
[0] = GNUTLS_TLS1
;
571 m
->protocol_priority
[1] = GNUTLS_SSL3
;
572 m
->protocol_priority
[2] = 0;
574 m
->cipher_priority
[0] = GNUTLS_CIPHER_AES_128_CBC
;
575 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
576 m
->cipher_priority
[2] = GNUTLS_CIPHER_AES_256_CBC
;
577 m
->cipher_priority
[3] = GNUTLS_CIPHER_ARCFOUR_128
;
578 m
->cipher_priority
[4] = 0;
580 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
581 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
582 m
->comp_priority
[2] = 0;
584 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
585 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
586 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
587 m
->kx_priority
[3] = 0;
589 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
590 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
591 m
->mac_priority
[2] = 0;
593 m
->connend
= GNUTLS_SERVER
;
599 SSLv3_client_method (void)
602 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
606 m
->protocol_priority
[0] = GNUTLS_SSL3
;
607 m
->protocol_priority
[2] = 0;
609 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
610 m
->cipher_priority
[2] = GNUTLS_CIPHER_ARCFOUR_128
;
611 m
->cipher_priority
[3] = 0;
613 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
614 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
615 m
->comp_priority
[2] = 0;
617 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
618 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
619 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
620 m
->kx_priority
[3] = 0;
622 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
623 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
624 m
->mac_priority
[2] = 0;
626 m
->connend
= GNUTLS_CLIENT
;
632 SSLv3_server_method (void)
635 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
639 m
->protocol_priority
[0] = GNUTLS_SSL3
;
640 m
->protocol_priority
[2] = 0;
642 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
643 m
->cipher_priority
[2] = GNUTLS_CIPHER_ARCFOUR_128
;
644 m
->cipher_priority
[3] = 0;
646 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
647 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
648 m
->comp_priority
[2] = 0;
650 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
651 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
652 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
653 m
->kx_priority
[3] = 0;
655 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
656 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
657 m
->mac_priority
[2] = 0;
659 m
->connend
= GNUTLS_SERVER
;
665 TLSv1_client_method (void)
668 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
672 m
->protocol_priority
[0] = GNUTLS_TLS1
;
673 m
->protocol_priority
[1] = 0;
675 m
->cipher_priority
[0] = GNUTLS_CIPHER_AES_128_CBC
;
676 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
677 m
->cipher_priority
[2] = GNUTLS_CIPHER_AES_256_CBC
;
678 m
->cipher_priority
[3] = GNUTLS_CIPHER_ARCFOUR_128
;
679 m
->cipher_priority
[4] = 0;
681 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
682 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
683 m
->comp_priority
[2] = 0;
685 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
686 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
687 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
688 m
->kx_priority
[3] = 0;
690 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
691 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
692 m
->mac_priority
[2] = 0;
694 m
->connend
= GNUTLS_CLIENT
;
700 TLSv1_server_method (void)
703 m
= (SSL_METHOD
*) calloc (1, sizeof (SSL_METHOD
));
707 m
->protocol_priority
[0] = GNUTLS_TLS1
;
708 m
->protocol_priority
[1] = 0;
710 m
->cipher_priority
[0] = GNUTLS_CIPHER_AES_128_CBC
;
711 m
->cipher_priority
[1] = GNUTLS_CIPHER_3DES_CBC
;
712 m
->cipher_priority
[2] = GNUTLS_CIPHER_AES_256_CBC
;
713 m
->cipher_priority
[3] = GNUTLS_CIPHER_ARCFOUR_128
;
714 m
->cipher_priority
[4] = 0;
716 m
->comp_priority
[0] = GNUTLS_COMP_ZLIB
;
717 m
->comp_priority
[1] = GNUTLS_COMP_NULL
;
718 m
->comp_priority
[2] = 0;
720 m
->kx_priority
[0] = GNUTLS_KX_DHE_RSA
;
721 m
->kx_priority
[1] = GNUTLS_KX_RSA
;
722 m
->kx_priority
[2] = GNUTLS_KX_DHE_DSS
;
723 m
->kx_priority
[3] = 0;
725 m
->mac_priority
[0] = GNUTLS_MAC_SHA1
;
726 m
->mac_priority
[1] = GNUTLS_MAC_MD5
;
727 m
->mac_priority
[2] = 0;
729 m
->connend
= GNUTLS_SERVER
;
735 /* SSL_CIPHER functions */
738 SSL_get_current_cipher (SSL
* ssl
)
743 ssl
->ciphersuite
.version
= gnutls_protocol_get_version (ssl
->gnutls_state
);
744 ssl
->ciphersuite
.cipher
= gnutls_cipher_get (ssl
->gnutls_state
);
745 ssl
->ciphersuite
.kx
= gnutls_kx_get (ssl
->gnutls_state
);
746 ssl
->ciphersuite
.mac
= gnutls_mac_get (ssl
->gnutls_state
);
747 ssl
->ciphersuite
.compression
= gnutls_compression_get (ssl
->gnutls_state
);
748 ssl
->ciphersuite
.cert
= gnutls_certificate_type_get (ssl
->gnutls_state
);
750 return &(ssl
->ciphersuite
);
754 SSL_CIPHER_get_name (SSL_CIPHER
* cipher
)
759 return gnutls_cipher_suite_get_name (cipher
->kx
,
760 cipher
->cipher
, cipher
->mac
);
764 SSL_CIPHER_get_bits (SSL_CIPHER
* cipher
, int *bits
)
771 bit_result
= (8 * gnutls_cipher_get_key_size (cipher
->cipher
));
780 SSL_CIPHER_get_version (SSL_CIPHER
* cipher
)
787 ret
= gnutls_protocol_get_name (cipher
->version
);
795 SSL_CIPHER_description (SSL_CIPHER
* cipher
, char *buf
, int size
)
809 tmpbuf
= (char *) malloc (128);
814 if (snprintf (tmpbuf
, tmpsize
, "%s %s %s %s",
815 gnutls_protocol_get_name (cipher
->version
),
816 gnutls_kx_get_name (cipher
->kx
),
817 gnutls_cipher_get_name (cipher
->cipher
),
818 gnutls_mac_get_name (cipher
->mac
)) == -1)
822 return "Buffer too small";
832 X509_get_subject_name (const X509
* cert
)
835 dn
= (gnutls_x509_dn
*) calloc (1, sizeof (gnutls_x509_dn
));
836 if (gnutls_x509_extract_certificate_dn (&cert
[0], dn
) < 0)
845 X509_get_issuer_name (const X509
* cert
)
848 dn
= (gnutls_x509_dn
*) calloc (1, sizeof (gnutls_x509_dn
));
849 if (gnutls_x509_extract_certificate_dn (&cert
[1], dn
) < 0)
858 X509_NAME_oneline (gnutls_x509_dn
* name
, char *buf
, int len
)
860 memset (buf
, 0, len
);
864 snprintf (buf
, len
- 1,
865 "C=%s, ST=%s, L=%s, O=%s, OU=%s, CN=%s/Email=%s",
866 name
->country
, name
->state_or_province_name
,
867 name
->locality_name
, name
->organization
,
868 name
->organizational_unit_name
, name
->common_name
, name
->email
);
873 X509_free (const X509
* cert
)
875 /* only get certificates as const items */
882 BIO_get_fd (gnutls_session_t gnutls_state
, int *fd
)
884 *fd
= GNUTLS_POINTER_TO_INT (gnutls_transport_get_ptr (gnutls_state
));
888 BIO_new_socket (int sock
, int close_flag
)
892 bio
= (BIO
*) malloc (sizeof (BIO
));
896 bio
->fd
= GNUTLS_INT_TO_POINTER (sock
);
909 ret
= -1 * last_error
;
916 ERR_error_string (unsigned long e
, char *buf
)
918 return gnutls_strerror (-1 * e
);
931 RAND_seed (const void *buf
, int num
)
936 RAND_bytes (unsigned char *buf
, int num
)
938 gc_random (buf
, num
);
943 RAND_file_name (char *buf
, size_t len
)
949 RAND_load_file (const char *name
, long maxbytes
)
955 RAND_write_file (const char *name
)
961 RAND_egd_bytes (const char *path
, int bytes
)
968 /* message digest functions */
971 MD5_Init (MD5_CTX
* ctx
)
973 gc_hash_open (GC_MD5
, 0, &ctx
->handle
);
977 MD5_Update (MD5_CTX
* ctx
, const void *buf
, int len
)
979 gc_hash_write (ctx
->handle
, len
, buf
);
983 MD5_Final (unsigned char *md
, MD5_CTX
* ctx
)
985 const char *local_md
;
987 local_md
= gc_hash_read (ctx
->handle
);
989 memcpy (md
, local_md
, gc_hash_digest_length (GC_MD5
));
990 gc_hash_close (ctx
->handle
);
994 MD5 (const unsigned char *buf
, unsigned long len
, unsigned char *md
)
999 gc_hash_buffer (GC_MD5
, buf
, len
, md
);
1005 RIPEMD160_Init (RIPEMD160_CTX
* ctx
)
1007 gc_hash_open (GC_RMD160
, 0, &ctx
->handle
);
1011 RIPEMD160_Update (RIPEMD160_CTX
* ctx
, const void *buf
, int len
)
1013 gc_hash_write (ctx
->handle
, len
, buf
);
1017 RIPEMD160_Final (unsigned char *md
, RIPEMD160_CTX
* ctx
)
1019 const char *local_md
;
1021 local_md
= gc_hash_read (ctx
->handle
);
1023 memcpy (md
, local_md
, gc_hash_digest_length (GC_RMD160
));
1024 gc_hash_close (ctx
->handle
);
1028 RIPEMD160 (const unsigned char *buf
, unsigned long len
, unsigned char *md
)
1033 gc_hash_buffer (GC_RMD160
, buf
, len
, md
);