FSAssertionArtifact.java revision a688bcbb4bcff5398fdd29b86f83450257dc0df4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * The contents of this file are subject to the terms
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * of the Common Development and Distribution License
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * (the License). You may not use this file except in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * compliance with the License.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * You can obtain a copy of the License at
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * https://opensso.dev.java.net/public/CDDLv1.0.html or
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * opensso/legal/CDDLv1.0.txt
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * See the License for the specific language governing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * permission and limitations under the License.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * When distributing Covered Code, include this CDDL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Header Notice in each file and include the License file
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * at opensso/legal/CDDLv1.0.txt.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If applicable, add the following below the CDDL Header,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * with the fields enclosed by brackets [] replaced by
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * your own identifying information:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * "Portions Copyrighted [year] [name of copyright owner]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * $Id: FSAssertionArtifact.java,v 1.3 2008/06/25 05:46:43 qcheng Exp $
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpackage com.sun.identity.federation.message;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.federation.common.IFSConstants;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.federation.message.common.FSMsgException;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.federation.common.FSUtils;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.saml.protocol.AssertionArtifact;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.saml.common.SAMLUtils;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinimport com.sun.identity.shared.encode.Base64;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This class represents the <code>AssertionArtifact</code> element in the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * <code>SAML</code> protocol schema. Current implementation supports
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * TYPE 1 artifact only. Other type of artifact can be supported by
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * extending this class.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * @supported.all.api
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpublic class FSAssertionArtifact extends AssertionArtifact {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Default Artifact length
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public final static int ARTIFACT_1_LENGTH = 42;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Default Artifact Type Code 0 Constant
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public final static byte ARTIFACT_1_TYPE_CODE_0 = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Default Artifact Type Code 1 Constant
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public final static byte ARTIFACT_1_TYPE_CODE_1 = 3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Default Artifact Type Code Byte Array
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public final static byte[] ARTIFACT_1_TYPE_CODE = {0, 3};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Default Constructor.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin protected FSAssertionArtifact() {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Constructor to create <code>AssertionArtifact</code> object.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * @param theArtifact is the string that is generated by a provider.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * @throws SAMLException if there is an error decoding
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the artifact string , the length of the artifact string
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * is incorrect , the <code>TYPE CODE</code> in the artifact
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * or other errors which prevent creation of
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * this object.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public FSAssertionArtifact(String theArtifact) throws FSMsgException {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // check if the input is empty
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((theArtifact == null) || (theArtifact.length() == 0)) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: empty input.");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("nullInput",null);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // decode the artifact
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin byte raw[] = Base64.decode(theArtifact);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(raw == null) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (FSUtils.debug.messageEnabled()) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: decode error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz throw new FSMsgException("wrongInput",null);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // check if the length is 42bytes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (raw.length != ARTIFACT_1_LENGTH) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (FSUtils.debug.messageEnabled()) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: the length is"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin + " not 42:" + raw.length);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("wrongInput",null);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin // check if the typecode is correct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((raw[0] != ARTIFACT_1_TYPE_CODE_0) ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (raw[1] != ARTIFACT_1_TYPE_CODE_1)) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: wrong typecode.");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("wrongInput", null);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeCode = ARTIFACT_1_TYPE_CODE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz artifact = theArtifact;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz // get the sourceID and assertionHandle
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin byte sBytes[] = new byte[IFSConstants.ART_ID_LENGTH];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin byte aBytes[] = new byte[IFSConstants.ART_ID_LENGTH];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin System.arraycopy(raw, 2, sBytes, 0, IFSConstants.ART_ID_LENGTH);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz System.arraycopy(raw, 22, aBytes, 0, IFSConstants.ART_ID_LENGTH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sourceID = SAMLUtils.byteArrayToString(sBytes);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin assertionHandle = SAMLUtils.byteArrayToString(aBytes);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Constructor to create <code>FSAssertionArtifact</code> object.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * @param idBytes the source identifier in the <code>Assertion</code>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * @param handleBytes the assertion identifier
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * @throws SAMLException if wrong input or couldn't encode the artifact.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin public FSAssertionArtifact(byte[] idBytes, byte[] handleBytes)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throws FSMsgException {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((idBytes == null) || (handleBytes == null)) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: null input.");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("nullInput",null);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((idBytes.length != IFSConstants.ART_ID_LENGTH) ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (handleBytes.length != IFSConstants.ART_ID_LENGTH)) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: wrong input length.");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("wrongInput",null);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sourceID = SAMLUtils.byteArrayToString(idBytes);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin assertionHandle = SAMLUtils.byteArrayToString(handleBytes);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz byte raw[] = new byte[42];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin raw[0] = ARTIFACT_1_TYPE_CODE_0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin raw[1] = ARTIFACT_1_TYPE_CODE_1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (int i = 0; i < IFSConstants.ART_ID_LENGTH; i++) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin raw[2+i] = idBytes[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin raw[22+i] = handleBytes[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz try {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin artifact = Base64.encode(raw).trim();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } catch (Exception e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (FSUtils.debug.messageEnabled()) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FSUtils.debug.message("FSAssertionArtifact: exception encode"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin + " input:", e);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin throw new FSMsgException("errorCreateArtifact",null);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeCode = ARTIFACT_1_TYPE_CODE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz