mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-10-30 22:28:46 +00:00 
			
		
		
		
	Add EncryptedAttribute support
Closes gh-9131
This commit is contained in:
		
							parent
							
								
									d0581c9a26
								
							
						
					
					
						commit
						c8cbf06d8d
					
				| @ -69,6 +69,7 @@ import org.opensaml.saml.saml2.core.Attribute; | ||||
| import org.opensaml.saml.saml2.core.AttributeStatement; | ||||
| import org.opensaml.saml.saml2.core.Condition; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAssertion; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAttribute; | ||||
| import org.opensaml.saml.saml2.core.NameID; | ||||
| import org.opensaml.saml.saml2.core.OneTimeUse; | ||||
| import org.opensaml.saml.saml2.core.Response; | ||||
| @ -647,6 +648,17 @@ public final class OpenSamlAuthenticationProvider implements AuthenticationProvi | ||||
| 		return (assertionToken) -> { | ||||
| 			Decrypter decrypter = this.decrypterConverter.convert(assertionToken.getToken()); | ||||
| 			Assertion assertion = assertionToken.getAssertion(); | ||||
| 			for (AttributeStatement statement : assertion.getAttributeStatements()) { | ||||
| 				for (EncryptedAttribute encryptedAttribute : statement.getEncryptedAttributes()) { | ||||
| 					try { | ||||
| 						Attribute attribute = decrypter.decrypt(encryptedAttribute); | ||||
| 						statement.getAttributes().add(attribute); | ||||
| 					} | ||||
| 					catch (Exception ex) { | ||||
| 						throw createAuthenticationException(Saml2ErrorCodes.DECRYPTION_ERROR, ex.getMessage(), ex); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if (assertion.getSubject() == null) { | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| @ -43,6 +43,7 @@ import org.opensaml.saml.saml2.assertion.SAML2AssertionValidationParameters; | ||||
| import org.opensaml.saml.saml2.core.Assertion; | ||||
| import org.opensaml.saml.saml2.core.AttributeStatement; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAssertion; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAttribute; | ||||
| import org.opensaml.saml.saml2.core.EncryptedID; | ||||
| import org.opensaml.saml.saml2.core.NameID; | ||||
| import org.opensaml.saml.saml2.core.OneTimeUse; | ||||
| @ -298,6 +299,25 @@ public class OpenSamlAuthenticationProviderTests { | ||||
| 		this.provider.authenticate(token); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void authenticateWhenEncryptedAttributeThenDecrypts() { | ||||
| 		Response response = TestOpenSamlObjects.response(); | ||||
| 		Assertion assertion = TestOpenSamlObjects.assertion(); | ||||
| 		EncryptedAttribute attribute = TestOpenSamlObjects.encrypted("name", "value", | ||||
| 				TestSaml2X509Credentials.assertingPartyEncryptingCredential()); | ||||
| 		AttributeStatement statement = build(AttributeStatement.DEFAULT_ELEMENT_NAME); | ||||
| 		statement.getEncryptedAttributes().add(attribute); | ||||
| 		assertion.getAttributeStatements().add(statement); | ||||
| 		response.getAssertions().add(assertion); | ||||
| 		TestOpenSamlObjects.signed(response, TestSaml2X509Credentials.assertingPartySigningCredential(), | ||||
| 				RELYING_PARTY_ENTITY_ID); | ||||
| 		Saml2AuthenticationToken token = token(response, TestSaml2X509Credentials.relyingPartyVerifyingCredential(), | ||||
| 				TestSaml2X509Credentials.relyingPartyDecryptingCredential()); | ||||
| 		Saml2Authentication authentication = (Saml2Authentication) this.provider.authenticate(token); | ||||
| 		Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) authentication.getPrincipal(); | ||||
| 		assertThat(principal.getAttribute("name")).containsExactly("value"); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void authenticateWhenDecryptionKeysAreMissingThenThrowAuthenticationException() throws Exception { | ||||
| 		Response response = TestOpenSamlObjects.response(); | ||||
|  | ||||
| @ -59,6 +59,7 @@ import org.opensaml.saml.saml2.core.AttributeValue; | ||||
| import org.opensaml.saml.saml2.core.AuthnRequest; | ||||
| import org.opensaml.saml.saml2.core.Conditions; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAssertion; | ||||
| import org.opensaml.saml.saml2.core.EncryptedAttribute; | ||||
| import org.opensaml.saml.saml2.core.EncryptedID; | ||||
| import org.opensaml.saml.saml2.core.Issuer; | ||||
| import org.opensaml.saml.saml2.core.NameID; | ||||
| @ -301,6 +302,18 @@ public final class TestOpenSamlObjects { | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	static EncryptedAttribute encrypted(String name, String value, Saml2X509Credential credential) { | ||||
| 		Attribute attribute = attribute(name, value); | ||||
| 		X509Certificate certificate = credential.getCertificate(); | ||||
| 		Encrypter encrypter = getEncrypter(certificate); | ||||
| 		try { | ||||
| 			return encrypter.encrypt(attribute); | ||||
| 		} | ||||
| 		catch (EncryptionException ex) { | ||||
| 			throw new Saml2Exception("Unable to encrypt nameID.", ex); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private static Encrypter getEncrypter(X509Certificate certificate) { | ||||
| 		String dataAlgorithm = XMLCipherParameters.AES_256; | ||||
| 		String keyAlgorithm = XMLCipherParameters.RSA_1_5; | ||||
| @ -318,6 +331,15 @@ public final class TestOpenSamlObjects { | ||||
| 		return encrypter; | ||||
| 	} | ||||
| 
 | ||||
| 	static Attribute attribute(String name, String value) { | ||||
| 		Attribute attribute = build(Attribute.DEFAULT_ELEMENT_NAME); | ||||
| 		attribute.setName(name); | ||||
| 		XSString xsValue = new XSStringBuilder().buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME); | ||||
| 		xsValue.setValue(value); | ||||
| 		attribute.getAttributeValues().add(xsValue); | ||||
| 		return attribute; | ||||
| 	} | ||||
| 
 | ||||
| 	static List<AttributeStatement> attributeStatements() { | ||||
| 		List<AttributeStatement> attributeStatements = new ArrayList<>(); | ||||
| 		AttributeStatementBuilder attributeStatementBuilder = new AttributeStatementBuilder(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user