/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.
 */
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.07.31 at 11:10:09 AM IST
//


package org.apache.xml.security.binding.xmldsig11;

import java.math.BigInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for ECParametersType complex type.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="ECParametersType"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="FieldID" type="{http://www.w3.org/2009/xmldsig11#}FieldIDType"/&gt;
 *         &lt;element name="Curve" type="{http://www.w3.org/2009/xmldsig11#}CurveType"/&gt;
 *         &lt;element name="Base" type="{http://www.w3.org/2009/xmldsig11#}ECPointType"/&gt;
 *         &lt;element name="Order" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
 *         &lt;element name="CoFactor" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/&gt;
 *         &lt;element name="ValidationData" type="{http://www.w3.org/2009/xmldsig11#}ECValidationDataType" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ECParametersType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
    "fieldID",
    "curve",
    "base",
    "order",
    "coFactor",
    "validationData"
})
public class ECParametersType {

    @XmlElement(name = "FieldID", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
    protected FieldIDType fieldID;
    @XmlElement(name = "Curve", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
    protected CurveType curve;
    @XmlElement(name = "Base", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
    protected byte[] base;
    @XmlElement(name = "Order", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
    protected byte[] order;
    @XmlElement(name = "CoFactor", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected BigInteger coFactor;
    @XmlElement(name = "ValidationData", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected ECValidationDataType validationData;

    /**
     * Gets the value of the fieldID property.
     *
     * @return
     *     possible object is
     *     {@link FieldIDType }
     *
     */
    public FieldIDType getFieldID() {
        return fieldID;
    }

    /**
     * Sets the value of the fieldID property.
     *
     * @param value
     *     allowed object is
     *     {@link FieldIDType }
     *
     */
    public void setFieldID(FieldIDType value) {
        this.fieldID = value;
    }

    /**
     * Gets the value of the curve property.
     *
     * @return
     *     possible object is
     *     {@link CurveType }
     *
     */
    public CurveType getCurve() {
        return curve;
    }

    /**
     * Sets the value of the curve property.
     *
     * @param value
     *     allowed object is
     *     {@link CurveType }
     *
     */
    public void setCurve(CurveType value) {
        this.curve = value;
    }

    /**
     * Gets the value of the base property.
     *
     * @return
     *     possible object is
     *     byte[]
     */
    public byte[] getBase() {
        return base;
    }

    /**
     * Sets the value of the base property.
     *
     * @param value
     *     allowed object is
     *     byte[]
     */
    public void setBase(byte[] value) {
        this.base = value;
    }

    /**
     * Gets the value of the order property.
     *
     * @return
     *     possible object is
     *     byte[]
     */
    public byte[] getOrder() {
        return order;
    }

    /**
     * Sets the value of the order property.
     *
     * @param value
     *     allowed object is
     *     byte[]
     */
    public void setOrder(byte[] value) {
        this.order = value;
    }

    /**
     * Gets the value of the coFactor property.
     *
     * @return
     *     possible object is
     *     {@link BigInteger }
     *
     */
    public BigInteger getCoFactor() {
        return coFactor;
    }

    /**
     * Sets the value of the coFactor property.
     *
     * @param value
     *     allowed object is
     *     {@link BigInteger }
     *
     */
    public void setCoFactor(BigInteger value) {
        this.coFactor = value;
    }

    /**
     * Gets the value of the validationData property.
     *
     * @return
     *     possible object is
     *     {@link ECValidationDataType }
     *
     */
    public ECValidationDataType getValidationData() {
        return validationData;
    }

    /**
     * Sets the value of the validationData property.
     *
     * @param value
     *     allowed object is
     *     {@link ECValidationDataType }
     *
     */
    public void setValidationData(ECValidationDataType value) {
        this.validationData = value;
    }

}
