<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>SAML2KeyInfo.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="right"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.html" class="el_package">org.apache.rahas.impl.util</a> &gt; <span class="el_source">SAML2KeyInfo.java</span></div><h1>SAML2KeyInfo.java</h1><pre class="source lang-java linenums">package org.apache.rahas.impl.util;

import org.opensaml.saml2.core.Assertion;

import java.security.cert.X509Certificate;/*
 * Copyright 2004,2005 The Apache Software Foundation.                         
 *                                                                             
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);             
 * 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 &quot;AS IS&quot; 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.                                              
 */

/**
 * TODO : This class should be moved to WSS4J once a new version of it is avaliable
 * This class holds the secrets contained in a SAML2 token.
 */
public class SAML2KeyInfo {
    /**
     * Certificates
     */
    private X509Certificate[] certs;

    /**
     * Key bytes (e.g.: held in an encrypted key)
     */
    private byte[] secret;

    /**
     * SAMLAssertion
     */
    Assertion assertion;

<span class="nc" id="L41">    public SAML2KeyInfo(Assertion assertions, X509Certificate[] certs) {</span>
<span class="nc" id="L42">        this.certs = certs;</span>
<span class="nc" id="L43">        this.assertion = assertions;</span>
<span class="nc" id="L44">    }</span>

<span class="nc" id="L46">    public SAML2KeyInfo(Assertion assertions, byte[] secret) {</span>
<span class="nc" id="L47">        this.secret = secret;</span>
<span class="nc" id="L48">        this.assertion = assertions;</span>
<span class="nc" id="L49">    }</span>

    public X509Certificate[] getCerts() {
<span class="nc" id="L52">        return certs;</span>
    }

    public byte[] getSecret() {
<span class="nc" id="L56">        return secret;</span>
    }

    public Assertion getAssertion() {
<span class="nc" id="L60">        return assertion;</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.6.1.201212231917</span></div></body></html>