Projet

Général

Profil

0001-Use-OpenSSL-EVP-API-to-work-around-deprecation-of-lo.patch

Benjamin Dauvergne, 16 novembre 2022 18:56

Télécharger (19,6 ko)

Voir les différences:

Subject: [PATCH 01/11] Use OpenSSL EVP API to work around deprecation of low
 level APIs in OpenSSL 3 (#71313)

OpenSSL API is used to sign query-string values in the SAML 2.0 Redirect binding.
Other binding only need the libxmlsec API as signature are XML DSIG signatures.
 lasso/id-ff/provider.c |   2 +-
 lasso/xml/private.h    |   4 +-
 lasso/xml/tools.c      | 325 ++++++++++++++++++++---------------------
 3 files changed, 162 insertions(+), 169 deletions(-)
lasso/id-ff/provider.c
1592 1592
int
1593 1593
lasso_provider_verify_query_signature(LassoProvider *provider, const char *message)
1594 1594
{
1595
	int (*check)(const char *, const xmlSecKey *) = NULL;
1595
	int (*check)(const char *, xmlSecKey *) = NULL;
1596 1596
	int rc = 0;
1597 1597
	int signature_rc = 0;
1598 1598
	GList *public_keys = NULL;
lasso/xml/private.h
218 218

  
219 219
char* lasso_query_sign(char *query, LassoSignatureContext signature_context);
220 220

  
221
int lasso_query_verify_signature(const char *query, const xmlSecKey *public_key);
221
int lasso_query_verify_signature(const char *query, xmlSecKey *public_key);
222 222

  
223
int lasso_saml2_query_verify_signature(const char *query, const xmlSecKey *sender_public_key);
223
int lasso_saml2_query_verify_signature(const char *query, xmlSecKey *sender_public_key);
224 224

  
225 225
char* lasso_sha1(const char *str);
226 226

  
lasso/xml/tools.c
46 46
#include <libxml/parserInternals.h>
47 47
#include <libxml/xmlIO.h>
48 48

  
49
#include <openssl/pem.h>
50
#include <openssl/sha.h>
51
#include <openssl/engine.h>
52
#include <openssl/hmac.h>
53 49
#include <openssl/evp.h>
54 50

  
55 51
#include <xmlsec/base64.h>
......
60 56
#include <xmlsec/errors.h>
61 57
#include <xmlsec/openssl/x509.h>
62 58
#include <xmlsec/openssl/crypto.h>
59
#include <xmlsec/openssl/evp.h>
63 60

  
64 61
#include <zlib.h>
65 62

  
......
481 478
lasso_query_sign(char *query, LassoSignatureContext context)
482 479
{
483 480
	char *digest = NULL; /* 160 bit buffer */
484
	RSA *rsa = NULL;
485
	DSA *dsa = NULL;
486 481
	unsigned char *sigret = NULL;
487
	unsigned int siglen = 0;
482
	size_t siglen = 0;
488 483
	xmlChar *b64_sigret = NULL, *e_b64_sigret = NULL;
489 484
	char *new_query = NULL, *s_new_query = NULL;
490 485
	int status = 0;
491 486
	const xmlChar *algo_href = NULL;
492
	char *hmac_key;
487
	unsigned char *hmac_key;
493 488
	size_t hmac_key_length;
494
	const EVP_MD *md = NULL;
495 489
	xmlSecKey *key;
496 490
	xmlSecKeyData *key_data;
497
	unsigned int sigret_size = 0;
498 491
	LassoSignatureMethod sign_method;
499
        lasso_error_t rc = 0;
492
	lasso_error_t rc = 0;
493

  
494
	const EVP_MD *md = NULL;
495
	EVP_MD_CTX *evp_md_ctx = NULL;
496
	EVP_PKEY *pkey = NULL;
497
	EVP_PKEY *hmac_pkey = NULL;
500 498

  
501 499
	g_return_val_if_fail(query != NULL, NULL);
502 500
	g_return_val_if_fail(lasso_ok_signature_method(context.signature_method), NULL);
......
546 544
		xmlFree(BAD_CAST t);
547 545
	}
548 546

  
549
	/* build buffer digest */
547
	/* define the digest algorithm */
550 548
	switch (sign_method) {
551 549
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
552 550
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
553
			digest = lasso_sha1(new_query);
551
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
552
			md = EVP_sha1();
554 553
			break;
555 554
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
556
			digest = lasso_sha256(new_query);
555
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
556
			md = EVP_sha256();
557 557
			break;
558 558
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
559
			digest = lasso_sha384(new_query);
559
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
560
			md = EVP_sha384();
560 561
			break;
561 562
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
562
			digest = lasso_sha512(new_query);
563
		default:
563
		case LASSO_SIGNATURE_METHOD_HMAC_SHA512:
564
			md = EVP_sha512();
564 565
			break;
566
		case LASSO_SIGNATURE_METHOD_NONE:
567
		case LASSO_SIGNATURE_METHOD_LAST:
568
			g_assert_not_reached();
565 569
	}
570

  
571
	/* Get the signture key */
566 572
	switch (sign_method) {
567 573
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
568
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
569 574
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
570 575
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
571 576
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
572
			if (digest == NULL) {
573
				message(G_LOG_LEVEL_CRITICAL, "Failed to build the buffer digest");
577
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
578
			pkey = xmlSecOpenSSLEvpKeyDataGetEvp(key_data);
579
			if (! pkey) {
580
				message(G_LOG_LEVEL_CRITICAL, "Failed to get assymetric key");
574 581
				goto done;
575 582
			}
576
		default:
577
			break;
578
	}
579
	/* extract the OpenSSL key */
580
	switch (sign_method) {
581
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
582
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
583
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
584
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
585
			rsa = xmlSecOpenSSLKeyDataRsaGetRsa(key_data);
586
			g_assert(rsa);
587
			/* alloc memory for sigret */
588
			sigret_size = RSA_size(rsa);
589
			break;
590
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
591
			dsa = xmlSecOpenSSLKeyDataDsaGetDsa(key_data);
592
			g_assert(dsa);
593
			/* alloc memory for sigret */
594
			sigret_size = DSA_size(dsa);
595 583
			break;
596 584
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
597
			md = EVP_sha1();
598
			sigret_size = EVP_MD_size(md);
599
			break;
600 585
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
601
			md = EVP_sha256();
602
			sigret_size = EVP_MD_size(md);
603
			break;
604 586
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
605
			md = EVP_sha384();
606
			sigret_size = EVP_MD_size(md);
607
			break;
608 587
		case LASSO_SIGNATURE_METHOD_HMAC_SHA512:
609
			md = EVP_sha512();
610
			sigret_size = EVP_MD_size(md);
588
			if ((rc = lasso_get_hmac_key(key, (void**)&hmac_key,
589
										 &hmac_key_length))) {
590
				message(G_LOG_LEVEL_CRITICAL, "Failed to get hmac key (%s)", lasso_strerror(rc));
591
				goto done;
592
			}
593
			g_assert(hmac_key);
594
			hmac_pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, hmac_key, (int)hmac_key_length);
595
			if (! hmac_key) {
596
				message(G_LOG_LEVEL_CRITICAL, "EVP_PKEY_new_mac_key failed");
597
				goto done;
598
			}
599
			pkey = hmac_pkey;
611 600
			break;
612
		default:
601
		case LASSO_SIGNATURE_METHOD_LAST:
602
		case LASSO_SIGNATURE_METHOD_NONE:
613 603
			g_assert_not_reached();
614 604
	}
615
	sigret = (unsigned char *)g_malloc (sigret_size);
616 605

  
617 606
	switch (sign_method) {
618 607
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
619
			/* sign digest message */
620
			status = RSA_sign(NID_sha1, (unsigned char*)digest, SHA_DIGEST_LENGTH, sigret,
621
					&siglen, rsa);
622
			break;
623 608
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
624
			/* sign digest message */
625
			status = RSA_sign(NID_sha256, (unsigned char*)digest, SHA256_DIGEST_LENGTH, sigret,
626
					&siglen, rsa);
627
			break;
628 609
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
629
			/* sign digest message */
630
			status = RSA_sign(NID_sha384, (unsigned char*)digest, SHA384_DIGEST_LENGTH, sigret,
631
					&siglen, rsa);
632
			break;
633 610
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
634
			/* sign digest message */
635
			status = RSA_sign(NID_sha512, (unsigned char*)digest, SHA512_DIGEST_LENGTH, sigret,
636
					&siglen, rsa);
637
			break;
638 611
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
639
			status = DSA_sign(NID_sha1, (unsigned char*)digest, SHA_DIGEST_LENGTH, sigret,
640
					&siglen, dsa);
641
			break;
642 612
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
643 613
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
644 614
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
645 615
		case LASSO_SIGNATURE_METHOD_HMAC_SHA512:
646
			if ((rc = lasso_get_hmac_key(key, (void**)&hmac_key,
647
										 &hmac_key_length))) {
648
				message(G_LOG_LEVEL_CRITICAL, "Failed to get hmac key (%s)", lasso_strerror(rc));
616
			evp_md_ctx = EVP_MD_CTX_create();
617
			if (EVP_DigestSignInit(evp_md_ctx, NULL, md, NULL, pkey) <= 0) {
618
				message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSignInit failed");
649 619
				goto done;
650 620
			}
651
			g_assert(hmac_key);
652

  
653
			/* key should be at least 128 bits long */
654
			if (hmac_key_length < 16) {
655
				critical("HMAC key should be at least 128 bits long");
621
			if (EVP_DigestSign(evp_md_ctx, NULL, &siglen, (unsigned char*)new_query, strlen(new_query)) <= 0) {
622
				message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSign failed");
623
				goto done;
624
			}
625
			sigret = g_malloc(siglen);
626
			if (EVP_DigestSign(evp_md_ctx, sigret, &siglen, (unsigned char*)new_query, strlen(new_query)) <= 0) {
627
				message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSign failed");
656 628
				goto done;
657 629
			}
658

  
659
			HMAC(md, hmac_key, hmac_key_length, (unsigned char *)new_query,
660
					strlen(new_query), sigret, &siglen);
661 630
			status = 1;
662 631
			break;
663 632
		case LASSO_SIGNATURE_METHOD_LAST:
......
665 634
			g_assert_not_reached();
666 635
	}
667 636

  
668
	g_assert(siglen == sigret_size);
669 637

  
670 638
	if (status == 0) {
671 639
		goto done;
672 640
	}
673 641

  
674 642
	/* Base64 encode the signature value */
675
	b64_sigret = xmlSecBase64Encode(sigret, sigret_size, 0);
643
	b64_sigret = xmlSecBase64Encode(sigret, siglen, 0);
676 644
	/* escape b64_sigret */
677 645
	e_b64_sigret = lasso_xmlURIEscapeStr((xmlChar*)b64_sigret, NULL);
678 646

  
......
701 669
	lasso_release(sigret);
702 670
	lasso_release_xml_string(b64_sigret);
703 671
	lasso_release_xml_string(e_b64_sigret);
704

  
672
	if (evp_md_ctx) {
673
		EVP_MD_CTX_free(evp_md_ctx);
674
		evp_md_ctx = NULL;
675
	}
676
	if (hmac_pkey) {
677
		EVP_PKEY_free(hmac_pkey);
678
		hmac_pkey = NULL;
679
		pkey = NULL;
680
	}
705 681
	return s_new_query;
706 682
}
707 683

  
......
728 704

  
729 705
static lasso_error_t
730 706
lasso_query_verify_helper(const char *signed_content, const char *b64_signature, const char *algorithm,
731
		const xmlSecKey *key)
707
		xmlSecKey *key)
732 708
{
733
	RSA *rsa = NULL;
734
	DSA *dsa = NULL;
735 709
	char *digest = NULL;
736
	xmlSecByte *signature = NULL;
737
	int key_size = 0;
710
	char *signature = NULL;
711
	unsigned int signature_len = 0;
738 712
	unsigned char *hmac_key = NULL;
739 713
	size_t hmac_key_length = 0;
740 714
	const EVP_MD *md = NULL;
741 715
	lasso_error_t rc = 0;
742 716
	LassoSignatureMethod method = LASSO_SIGNATURE_METHOD_NONE;
743
	size_t digest_size = 1;
744
	int type = -1;
717
	EVP_PKEY *hmac_pkey = NULL;
718
	unsigned char *new_signature = NULL;
719
	EVP_MD_CTX *evp_md_ctx = NULL;
745 720

  
746 721
	if (lasso_strisequal(algorithm, (char*)xmlSecHrefRsaSha1)) {
747 722
		goto_cleanup_if_fail_with_rc(key->value->id == xmlSecOpenSSLKeyDataRsaId,
748 723
				LASSO_DS_ERROR_INVALID_SIGALG)
749
		rsa = xmlSecOpenSSLKeyDataRsaGetRsa(key->value);
750
		key_size = RSA_size(rsa);
751 724
		method = LASSO_SIGNATURE_METHOD_RSA_SHA1;
752
		digest_size = SHA_DIGEST_LENGTH;
753
		type = NID_sha1;
754 725
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefDsaSha1)) {
755 726
		goto_cleanup_if_fail_with_rc(key->value->id == xmlSecOpenSSLKeyDataDsaId, LASSO_DS_ERROR_INVALID_SIGALG);
756
		dsa = xmlSecOpenSSLKeyDataDsaGetDsa(key->value);
757
		key_size = DSA_size(dsa);
758 727
		method = LASSO_SIGNATURE_METHOD_DSA_SHA1;
759
		digest_size = SHA_DIGEST_LENGTH;
760
		type = NID_sha1;
761 728
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefRsaSha256)) {
762 729
		goto_cleanup_if_fail_with_rc(key->value->id == xmlSecOpenSSLKeyDataRsaId,
763 730
				LASSO_DS_ERROR_INVALID_SIGALG)
764
		rsa = xmlSecOpenSSLKeyDataRsaGetRsa(key->value);
765
		key_size = RSA_size(rsa);
766 731
		method = LASSO_SIGNATURE_METHOD_RSA_SHA256;
767
		digest_size = SHA256_DIGEST_LENGTH;
768
		type = NID_sha256;
769 732
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefRsaSha384)) {
770 733
		goto_cleanup_if_fail_with_rc(key->value->id == xmlSecOpenSSLKeyDataRsaId,
771 734
				LASSO_DS_ERROR_INVALID_SIGALG)
772
		rsa = xmlSecOpenSSLKeyDataRsaGetRsa(key->value);
773
		key_size = RSA_size(rsa);
774 735
		method = LASSO_SIGNATURE_METHOD_RSA_SHA384;
775
		digest_size = SHA384_DIGEST_LENGTH;
776
		type = NID_sha384;
777 736
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefRsaSha512)) {
778 737
		goto_cleanup_if_fail_with_rc(key->value->id == xmlSecOpenSSLKeyDataRsaId,
779 738
				LASSO_DS_ERROR_INVALID_SIGALG)
780
		rsa = xmlSecOpenSSLKeyDataRsaGetRsa(key->value);
781
		key_size = RSA_size(rsa);
782 739
		method = LASSO_SIGNATURE_METHOD_RSA_SHA512;
783
		digest_size = SHA512_DIGEST_LENGTH;
784
		type = NID_sha512;
785 740
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefHmacSha1)) {
786 741
		lasso_check_good_rc(lasso_get_hmac_key(key, (void**)&hmac_key, &hmac_key_length));
787
		md = EVP_sha1();
788
		key_size = EVP_MD_size(md);
789 742
		method = LASSO_SIGNATURE_METHOD_HMAC_SHA1;
790 743
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefHmacSha256)) {
791 744
		lasso_check_good_rc(lasso_get_hmac_key(key, (void**)&hmac_key, &hmac_key_length));
792
		md = EVP_sha256();
793
		key_size = EVP_MD_size(md);
794 745
		method = LASSO_SIGNATURE_METHOD_HMAC_SHA256;
795 746
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefHmacSha384)) {
796 747
		lasso_check_good_rc(lasso_get_hmac_key(key, (void**)&hmac_key, &hmac_key_length));
797
		md = EVP_sha384();
798
		key_size = EVP_MD_size(md);
799 748
		method = LASSO_SIGNATURE_METHOD_HMAC_SHA384;
800 749
	} else if (lasso_strisequal(algorithm, (char*)xmlSecHrefHmacSha512)) {
801 750
		lasso_check_good_rc(lasso_get_hmac_key(key, (void**)&hmac_key, &hmac_key_length));
802
		md = EVP_sha512();
803
		key_size = EVP_MD_size(md);
804 751
		method = LASSO_SIGNATURE_METHOD_HMAC_SHA512;
805 752
	} else {
806 753
		goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGALG);
807 754
	}
808 755

  
809
	/* is the signature algo allowed */
810
	goto_cleanup_if_fail_with_rc(
811
                lasso_allowed_signature_method(method),
812
                LASSO_DS_ERROR_INVALID_SIGALG);
813

  
814
	/* decode signature */
815
	signature = g_malloc(key_size+1);
816
	goto_cleanup_if_fail_with_rc(
817
			xmlSecBase64Decode((xmlChar*)b64_signature, signature, key_size+1) != 0,
818
			LASSO_DS_ERROR_INVALID_SIGNATURE);
819
	/* digest */
756
	/* define the digest algorithm */
820 757
	switch (method) {
821 758
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
822 759
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
823
			digest = lasso_sha1(signed_content);
760
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
761
			md = EVP_sha1();
824 762
			break;
825 763
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
826
			digest = lasso_sha256(signed_content);
764
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
765
			md = EVP_sha256();
827 766
			break;
828 767
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
829
			digest = lasso_sha384(signed_content);
768
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
769
			md = EVP_sha384();
830 770
			break;
831 771
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
832
			digest = lasso_sha512(signed_content);
833
			break;
834
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
835
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
836
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
837 772
		case LASSO_SIGNATURE_METHOD_HMAC_SHA512:
773
			md = EVP_sha512();
838 774
			break;
839
		default:
775
		case LASSO_SIGNATURE_METHOD_NONE:
776
		case LASSO_SIGNATURE_METHOD_LAST:
840 777
			g_assert_not_reached();
841 778
	}
779

  
780
	/* is the signature algo allowed */
781
	goto_cleanup_if_fail_with_rc(
782
			lasso_allowed_signature_method(method),
783
			LASSO_DS_ERROR_INVALID_SIGALG);
784

  
785
	/* decode signature */
786
	goto_cleanup_if_fail_with_rc(
787
			lasso_base64_decode(b64_signature, &signature, (int*)&signature_len),
788
			LASSO_DS_ERROR_INVALID_SIGNATURE);
842 789
	/* verify signature */
790
	evp_md_ctx = EVP_MD_CTX_create();
791

  
843 792
	switch (method) {
844 793
		case LASSO_SIGNATURE_METHOD_RSA_SHA1:
845 794
		case LASSO_SIGNATURE_METHOD_RSA_SHA256:
846 795
		case LASSO_SIGNATURE_METHOD_RSA_SHA384:
847 796
		case LASSO_SIGNATURE_METHOD_RSA_SHA512:
848
			goto_cleanup_if_fail_with_rc(
849
					RSA_verify(
850
						type,
851
						(unsigned char*)digest,
852
						digest_size,
853
						signature,
854
						key_size, rsa) == 1,
855
					LASSO_DS_ERROR_INVALID_SIGNATURE);
856
			break;
857 797
		case LASSO_SIGNATURE_METHOD_DSA_SHA1:
858
			goto_cleanup_if_fail_with_rc(
859
					DSA_verify(
860
						type,
861
						(unsigned char*)digest,
862
						digest_size,
863
						signature,
864
						key_size, dsa) == 1,
865
					LASSO_DS_ERROR_INVALID_SIGNATURE);
798
			{
799
				xmlSecKeyData *key_data = xmlSecKeyGetValue(key);
800
				if (! key_data) {
801
					message(G_LOG_LEVEL_CRITICAL, "Failed to get KeyData");
802
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
803
				}
804
				EVP_PKEY *pkey = xmlSecOpenSSLEvpKeyDataGetEvp(key_data);
805
				if (! pkey) {
806
					message(G_LOG_LEVEL_CRITICAL, "Failed to get assymetric key");
807
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
808
				}
809
				if (1 != EVP_DigestVerifyInit(evp_md_ctx, NULL, md, NULL, pkey)) {
810
					message(G_LOG_LEVEL_CRITICAL, "EVP_DigestVerifyInit failed");
811
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
812
				}
813
				if (1 != EVP_DigestVerifyUpdate(evp_md_ctx, signed_content, strlen(signed_content))) {
814
					message(G_LOG_LEVEL_CRITICAL, "EVP_DigestVerifyUpdate failed");
815
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
816
				}
817
				if(1 != EVP_DigestVerifyFinal(evp_md_ctx, (unsigned char*)signature, signature_len)) {
818
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
819
				}
820
			}
866 821
			break;
867 822
		case LASSO_SIGNATURE_METHOD_HMAC_SHA1:
868 823
		case LASSO_SIGNATURE_METHOD_HMAC_SHA256:
869 824
		case LASSO_SIGNATURE_METHOD_HMAC_SHA384:
870 825
		case LASSO_SIGNATURE_METHOD_HMAC_SHA512:
871
			digest = g_malloc(key_size);
872
			HMAC(md, hmac_key, hmac_key_length, (unsigned char*)signed_content,
873
				strlen(signed_content), (unsigned char*)digest, NULL);
826
			{
827
				unsigned char *hmac_key;
828
				size_t hmac_key_length;
829
				size_t new_signature_len;
830

  
831
				if ((rc = lasso_get_hmac_key(key, (void**)&hmac_key,
832
											 &hmac_key_length))) {
833
					message(G_LOG_LEVEL_CRITICAL, "Failed to get hmac key (%s)", lasso_strerror(rc));
834
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
835
				}
836
				g_assert(hmac_key);
837
				hmac_pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, hmac_key, (int)hmac_key_length);
838
				if (! hmac_key) {
839
					message(G_LOG_LEVEL_CRITICAL, "EVP_PKEY_new_mac_key failed");
840
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
841
				}
874 842

  
875
			goto_cleanup_if_fail_with_rc(lasso_crypto_memequal(digest, signature,
876
						key_size),
877
					LASSO_DS_ERROR_INVALID_SIGNATURE);
843
				if (EVP_DigestSignInit(evp_md_ctx, NULL, md, NULL, hmac_pkey) != 1) {
844
					message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSignInit failed");
845
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
846
				}
847
				if (EVP_DigestSign(evp_md_ctx, NULL, &new_signature_len, (unsigned char*)signed_content, strlen(signed_content)) != 1) {
848
					message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSign failed");
849
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
850
				}
851
				if (new_signature_len != signature_len) {
852
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
853
				}
854
				new_signature = g_malloc(new_signature_len);
855
				if (EVP_DigestSign(evp_md_ctx, new_signature, &new_signature_len, (unsigned char*)signed_content, strlen(signed_content)) != 1) {
856
					message(G_LOG_LEVEL_CRITICAL, "EVP_DigestSign failed");
857
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
858
				}
859
				if (CRYPTO_memcmp(signature, new_signature, signature_len) != 0) {
860
					goto_cleanup_with_rc(LASSO_DS_ERROR_INVALID_SIGNATURE);
861
				}
862
			}
878 863
			break;
879 864
		case LASSO_SIGNATURE_METHOD_NONE:
880 865
		case LASSO_SIGNATURE_METHOD_LAST:
......
882 867
	}
883 868
cleanup:
884 869
	lasso_release_string(digest);
885
	lasso_release_string(signature);
870
	lasso_release_string(new_signature);
871
	if (evp_md_ctx) {
872
		EVP_MD_CTX_free(evp_md_ctx);
873
		evp_md_ctx = NULL;
874
	}
875
	if (hmac_pkey) {
876
		EVP_PKEY_free(hmac_pkey);
877
		hmac_pkey = NULL;
878
	}
886 879
	return rc;
887 880

  
888 881
}
......
899 892
 * a negative value if an error occurs during verification
900 893
 **/
901 894
lasso_error_t
902
lasso_query_verify_signature(const char *query, const xmlSecKey *sender_public_key)
895
lasso_query_verify_signature(const char *query, xmlSecKey *sender_public_key)
903 896
{
904 897
	gchar **str_split = NULL;
905 898
	char *b64_signature = NULL;
......
958 951
 * Return value: 0 if signature is validated, an error code otherwise.
959 952
 */
960 953
int
961
lasso_saml2_query_verify_signature(const char *query, const xmlSecKey *sender_public_key)
954
lasso_saml2_query_verify_signature(const char *query, xmlSecKey *sender_public_key)
962 955
{
963 956
	char *b64_signature = NULL;
964 957
	char *query_copy = NULL;
965
-