All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.swedenconnect.opensaml.xmlsec.encryption.support.DecryptionUtils Maven / Gradle / Ivy

/*
 * Copyright 2019-2024 Sweden Connect
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package se.swedenconnect.opensaml.xmlsec.encryption.support;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.opensaml.core.config.ConfigurationService;
import org.opensaml.saml.saml2.encryption.EncryptedElementTypeEncryptedKeyResolver;
import org.opensaml.security.credential.Credential;
import org.opensaml.xmlsec.DecryptionConfiguration;
import org.opensaml.xmlsec.DecryptionParameters;
import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
import org.opensaml.xmlsec.encryption.support.ChainingEncryptedKeyResolver;
import org.opensaml.xmlsec.encryption.support.Decrypter;
import org.opensaml.xmlsec.encryption.support.InlineEncryptedKeyResolver;
import org.opensaml.xmlsec.encryption.support.SimpleKeyInfoReferenceEncryptedKeyResolver;
import org.opensaml.xmlsec.encryption.support.SimpleRetrievalMethodEncryptedKeyResolver;
import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
import org.opensaml.xmlsec.keyinfo.impl.ChainingKeyInfoCredentialResolver;
import org.opensaml.xmlsec.keyinfo.impl.CollectionKeyInfoCredentialResolver;
import org.opensaml.xmlsec.keyinfo.impl.KeyInfoProvider;
import org.opensaml.xmlsec.keyinfo.impl.LocalKeyInfoCredentialResolver;
import org.opensaml.xmlsec.keyinfo.impl.StaticKeyInfoCredentialResolver;
import org.opensaml.xmlsec.keyinfo.impl.provider.AgreementMethodKeyInfoProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.DEREncodedKeyValueProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.DSAKeyValueProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.ECKeyValueProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.InlineX509DataProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.KeyInfoReferenceProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.RSAKeyValueProvider;

/**
 * Utility class with helper methods for decryption.
 *
 * @author Martin Lindström ([email protected])
 * @author Stefan Santesson ([email protected])
 */
public class DecryptionUtils {

  /**
   * Utility method that sets up {@link DecryptionParameters} for a {@link Decrypter} instance.
   *
   * @param localCredentials the decrypter's credentials
   * @return the parameters needed to instantiate a {@link Decrypter} object
   */
  public static DecryptionParameters createDecryptionParameters(final Credential... localCredentials) {
    final DecryptionParameters parameters = new DecryptionParameters();

    DecryptionConfiguration config = ConfigurationService.get(DecryptionConfiguration.class);
    if (config == null) {
      config = DefaultSecurityConfigurationBootstrap.buildDefaultDecryptionConfiguration();
    }

    parameters.setExcludedAlgorithms(config.getExcludedAlgorithms());
    parameters.setIncludedAlgorithms(config.getIncludedAlgorithms());
    parameters.setDataKeyInfoCredentialResolver(config.getDataKeyInfoCredentialResolver());

    // We set our own encrypted key resolver (OpenSAML defaults don't include EncryptedElementTypeEncryptedKeyResolver).
    //
    final ChainingEncryptedKeyResolver encryptedKeyResolver = new ChainingEncryptedKeyResolver(Arrays.asList(
        new InlineEncryptedKeyResolver(),
        new EncryptedElementTypeEncryptedKeyResolver(),
        new SimpleRetrievalMethodEncryptedKeyResolver(),
        new SimpleKeyInfoReferenceEncryptedKeyResolver()));

    parameters.setEncryptedKeyResolver(encryptedKeyResolver);

    // Based on the supplied local credentials, set a key info credential resolver.
    //
    parameters.setKEKKeyInfoCredentialResolver(createKeyInfoCredentialResolver(localCredentials));

    return parameters;
  }

  /**
   * Builds a KeyInfo credential resolver to be used during decryption of a SAML object.
   *
   * @param localCredentials the decrypter's credentials
   * @return a {@code KeyInfoCredentialResolver} instance.
   */
  public static KeyInfoCredentialResolver createKeyInfoCredentialResolver(final Credential... localCredentials) {

    final ArrayList providers = new ArrayList<>();
    providers.add(new AgreementMethodKeyInfoProvider());
    providers.add(new RSAKeyValueProvider());
    providers.add(new ECKeyValueProvider());
    providers.add(new DSAKeyValueProvider());
    providers.add(new DEREncodedKeyValueProvider());
    providers.add(new InlineX509DataProvider());
    providers.add(new KeyInfoReferenceProvider());

    final List credList =
        localCredentials != null ? Arrays.asList(localCredentials) : Collections.emptyList();

    return new ChainingKeyInfoCredentialResolver(Arrays.asList(
        new LocalKeyInfoCredentialResolver(providers, new CollectionKeyInfoCredentialResolver(credList)),
        new StaticKeyInfoCredentialResolver(credList)));
  }

  protected DecryptionUtils() {
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy