text: /*
   * 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.
   */
  
  #ifndef _DECAF_SECURITY_KEY_H
  #define _DECAF_SECURITY_KEY_H
  
  #include <decaf/util/Config.h>
  
  #include <vector>
  #include <string>
  
  namespace decaf {
  namespace security {
  
      /**
       * The Key interface is the top-level interface for all keys. It defines the
       * functionality shared by all key objects. All keys have three
       * characteristics:<br>
       * <br>
       * An Algorithm <br>
       * This is the key algorithm for that key. The key algorithm is usually an
       * encryption or asymmetric operation algorithm (such as DSA or RSA), which
       * will work with those algorithms and with related algorithms (such as MD5
       * with RSA, SHA-1 with RSA, Raw DSA, etc.) The name of the algorithm of a
       * key is obtained using the getAlgorithm method.<br>
       * <br>
       * An Encoded Form <br>
       * This is an external encoded form for the key used when a standard
       * representation of the key is needed outside the application, as
       * when transmitting the key to some other party. The key is encoded
       * according to a standard format (such as X.509 SubjectPublicKeyInfo or
       * PKCS#8), and is returned using the getEncoded method. Note: The syntax of
       * the ASN.1 type SubjectPublicKeyInfo is defined as follows:
       * <br>
       * SubjectPublicKeyInfo ::= SEQUENCE { <br>
       *    algorithm AlgorithmIdentifier, <br>
       *    subjectPublicKey BIT STRING } <br>
       * <br>
       * AlgorithmIdentifier ::= SEQUENCE { <br>
       *    algorithm OBJECT IDENTIFIER, <br>
       *    parameters ANY DEFINED BY algorithm OPTIONAL } <br>
       * <br>
       * For more information, see RFC 2459: Internet X.509 Public Key
       * Infrastructure Certificate and CRL Profile. <br>
       * <br>
       * A Format <br>
       * This is the name of the format of the encoded key. It is returned by the
       * getFormat method.
       */
      class DECAF_API Key {
      public:
  
          virtual ~Key();
  
          /**
           * Returns the standard algorithm name for this key. For example, "DSA"
           * would indicate that this key is a DSA key.
           *
           * @return the name of the algorithm associated with this key.
           */
          virtual std::string getAlgorithm() const = 0;
  
          /**
           * Provides the key in its primary encoding format, or nothing if this
           * key does not support encoding.
           *
           * @param output
           *      Receives the encoded key, or nothing if the key does not support
           *      encoding.
           */
          virtual void getEncoded(std::vector<unsigned char>& output) const = 0;
  
          /**
           * Returns the name of the primary encoding format of this key, or
           * an empty string if this key does not support encoding. The primary
           * encoding format is named in terms of the appropriate ASN.1 data
           * format, if an ASN.1 specification for this key exists. For example,
           * the name of the ASN.1 data format for public keys is
           * SubjectPublicKeyInfo, as defined by the X.509 standard; in this
           * case, the returned format is "X.509". Similarly, the name of the
           * ASN.1 data format for private keys is PrivateKeyInfo, as defined by
           * the PKCS #8 standard; in this case, the returned format is "PKCS#8".
           *
           * @return the primary encoding format of the key.
           */
          virtual std::string getFormat() const = 0;
  
      };
  }}
  
  #endif /*_DECAF_SECURITY_KEY_H*/
  