123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501 |
- /*############################################################################
- # Copyright 2016 Intel Corporation
- #
- # 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.
- ############################################################################*/
- #ifndef EPID_VERIFIER_1_1_API_H_
- #define EPID_VERIFIER_1_1_API_H_
- #include <stddef.h>
- #include "epid/common/stdtypes.h"
- #include "epid/common/1.1/types.h"
- #include "epid/common/errors.h"
- #include "epid/verifier/api.h"
- #ifdef __cplusplus
- extern "C"{
- #endif
- /*!
- * \file
- * \brief Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API.
- */
- /// Intel(R) EPID 1.1 Verifier functionality
- /*!
- \defgroup Epid11VerifierModule EPID 1.1 support
- To verify signatures coming from member devices that belong to an
- Intel® EPID 1.1 group, you need to use Intel® EPID 1.1
- verifier APIs.
- If you are acting as a verifier for both Intel® EPID 1.1 and 2.0
- members, you can determine if you need version 1.1 or 2.0
- verification by checking the Intel® EPID version field in the
- group public key file (see ::EpidParseFileHeader). You can also
- check the version in other binary issuer material, such as the
- GroupRL and SigRL.
- The 1.1 verifier APIs take a verifier context as input. Each
- verifier context (::Epid11VerifierCtx) represents a verifier for a
- single group.
- The Intel® EPID 1.1 specification does not provide hash algorithm
- selection and verifier blacklist revocation. Therefore, APIs such as
- ::EpidVerifierSetHashAlg and ::EpidVerifierSetVerifierRl are not
- available.
- You can find the Intel® EPID 1.1 API headers in the 1.1
- directories, for example, `epid/verifier/1.1/api.h`.
- Intel® EPID 1.1 APIs and data structures are indicated with the
- "Epid11" prefix. For example, the Intel® EPID 1.1 version of
- ::EpidParseGroupPubKeyFile is called ::Epid11ParseGroupPubKeyFile,
- and the Intel® EPID 1.1 version of `GroupRl` is `Epid11GroupRl`.
- \ingroup EpidVerifierModule
- @{
- */
- /// Internal context of Intel(R) EPID 1.1 verifier.
- typedef struct Epid11VerifierCtx Epid11VerifierCtx;
- /// Intel(R) EPID 1.1 Pre-computed verifier settings.
- /*!
- Serialized form of the information about a verifier that remains stable for
- a given set of keys.
- This API supports Intel(R) EPID 1.1 verification.
- \note e12 = 0 implies that this data is not valid
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- #pragma pack(1)
- typedef struct Epid11VerifierPrecomp {
- Epid11GroupId gid; ///< group ID
- Epid11GtElemStr e12; ///< an element in GT
- Epid11GtElemStr e22; ///< an element in GT
- Epid11GtElemStr e2w; ///< an element in GT
- } Epid11VerifierPrecomp;
- #pragma pack()
- /// Creates a new Intel(R) EPID 1.1 verifier context.
- /*!
- Must be called to create the verifier context that is used by
- other "Verifier" APIs.
- Allocates memory for the context, then initialize it.
- Epid11VerifierDelete() must be called to safely release the member context.
- \param[in] pub_key
- The group certificate.
- \param[in] precomp
- Optional pre-computed data. If NULL the value is computed internally and is
- readable using Epid11VerifierWritePrecomp().
- \param[out] ctx
- Newly constructed verifier context.
- \returns ::EpidStatus
- \note
- If the result is not ::kEpidNoErr the content of ctx is undefined.
- \see Epid11VerifierDelete
- \see Epid11VerifierWritePrecomp
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifierCreate(Epid11GroupPubKey const* pub_key,
- Epid11VerifierPrecomp const* precomp,
- Epid11VerifierCtx** ctx);
- /// Deletes an existing Intel(R) EPID 1.1 verifier context.
- /*!
- Must be called to safely release a verifier context created using
- Epid11VerifierCreate().
- De-initializes the context, frees memory used by the context, and sets the
- context pointer to NULL.
- \param[in,out] ctx
- The verifier context. Can be NULL.
- \see Epid11VerifierCreate
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- void Epid11VerifierDelete(Epid11VerifierCtx** ctx);
- /// Serializes the pre-computed Intel(R) EPID 1.1 verifier settings.
- /*!
- \param[in] ctx
- The verifier context.
- \param[out] precomp
- The Serialized pre-computed verifier settings.
- \returns ::EpidStatus
- \note
- If the result is not ::kEpidNoErr the content of precomp is undefined.
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifierWritePrecomp(Epid11VerifierCtx const* ctx,
- Epid11VerifierPrecomp* precomp);
- /// Sets the Intel(R) EPID 1.1 private key based revocation list.
- /*!
- The caller is responsible to for ensuring the revocation list is authorized,
- e.g signed by the issuer. The caller is also responsible checking the version
- of the revocation list. The call will fail if trying to set an older version
- of the revocation list than was last set.
- This API supports Intel(R) EPID 1.1 verification.
- \attention
- The memory pointed to by priv_rl will be accessed directly by the verifier
- until a new list is set or the verifier is destroyed. Do not modify the
- contents of this memory. The behavior of subsequent operations that rely on
- the revocation list will be undefined if the memory is modified.
- \attention
- It is the responsibility of the caller to free the memory pointed to by priv_rl
- after the verifier is no longer using it.
- \param[in,out] ctx
- The verifier context.
- \param[in] priv_rl
- The private key based revocation list.
- \param[in] priv_rl_size
- The size of the private key based revocation list in bytes.
- \returns ::EpidStatus
- \note
- If the result is not ::kEpidNoErr the private key based revocation list
- pointed to by the verifier is undefined.
- \see Epid11VerifierCreate
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifierSetPrivRl(Epid11VerifierCtx* ctx,
- Epid11PrivRl const* priv_rl,
- size_t priv_rl_size);
- /// Sets the Intel(R) EPID 1.1 signature based revocation list.
- /*!
- The caller is responsible to for ensuring the revocation list is authorized,
- e.g signed by the issuer. The caller is also responsible checking the version
- of the revocation list. The call will fail if trying to set an older version
- of the revocation list than was last set.
- This API supports Intel(R) EPID 1.1 verification.
- \attention
- The memory pointed to by sig_rl will be accessed directly by the verifier
- until a new list is set or the verifier is destroyed. Do not modify the
- contents of this memory. The behavior of subsequent operations that rely on
- the revocation list will be undefined if the memory is modified.
- \attention
- It is the responsibility of the caller to free the memory pointed to by sig_rl
- after the verifier is no longer using it.
- \param[in,out] ctx
- The verifier context.
- \param[in] sig_rl
- The signature based revocation list.
- \param[in] sig_rl_size
- The size of the signature based revocation list in bytes.
- \returns ::EpidStatus
- \note
- If the result is not ::kEpidNoErr the signature based revocation list pointed
- to by the verifier is undefined.
- \see Epid11VerifierCreate
- \see SdkOverview_11Verifier \see <a
- href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifierSetSigRl(Epid11VerifierCtx* ctx,
- Epid11SigRl const* sig_rl,
- size_t sig_rl_size);
- /// Sets the Intel(R) EPID 1.1 group based revocation list.
- /*!
- The caller is responsible to for ensuring the revocation list is authorized,
- e.g signed by the issuer. The caller is also responsible checking the version
- of the revocation list. The call will fail if trying to set an older version
- of the revocation list than was last set.
- This API supports Intel(R) EPID 1.1 verification.
- \attention
- The memory pointed to by grp_rl will be accessed directly by the verifier
- until a new list is set or the verifier is destroyed. Do not modify the
- contents of this memory. The behavior of subsequent operations that rely on
- the revocation list will be undefined if the memory is modified.
- \attention
- It is the responsibility of the caller to free the memory pointed to by grp_rl
- after the verifier is no longer using it.
- \param[in,out] ctx
- The verifier context.
- \param[in] grp_rl
- The group based revocation list.
- \param[in] grp_rl_size
- The size of the group based revocation list in bytes.
- \returns ::EpidStatus
- \note
- If the result is not ::kEpidNoErr the group based revocation list pointed
- to by the verifier is undefined.
- \see Epid11VerifierCreate
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifierSetGroupRl(Epid11VerifierCtx* ctx,
- Epid11GroupRl const* grp_rl,
- size_t grp_rl_size);
- /// Sets the basename to be used by a verifier.
- /*!
- This API allows setting a zero length base name.
- \warning
- Not all members in the Intel(R) EPID 1.1 ecosystem may support zero length
- basenames. They may interpret a zero length basename as random base.
- \param[in, out] ctx
- The verifier context.
- \param[in] basename
- The basename. Pass NULL for random base.
- \param[in] basename_len
- Number of bytes in basename buffer. Must be 0 if basename is NULL.
- \returns ::EpidStatus
- \see Epid11VerifierCreate
- */
- EpidStatus Epid11VerifierSetBasename(Epid11VerifierCtx* ctx,
- void const* basename, size_t basename_len);
- /// Verifies an Intel(R) EPID 1.1 signature and checks revocation status.
- /*!
- \param[in] ctx
- The verifier context.
- \param[in] sig
- The signature.
- \param[in] sig_len
- The size of sig in bytes.
- \param[in] msg
- The message that was signed.
- \param[in] msg_len
- The size of msg in bytes.
- \returns ::EpidStatus
- \retval ::kEpidSigValid
- Signature validated successfully
- \retval ::kEpidSigInvalid
- Signature is invalid
- \retval ::kEpidSigRevokedInGroupRl
- Signature revoked in GroupRl
- \retval ::kEpidSigRevokedInPrivRl
- Signature revoked in PrivRl
- \retval ::kEpidSigRevokedInSigRl
- Signature revoked in SigRl
- \note
- If the result is not ::kEpidNoErr or one of the values listed above the
- verify should de considered to have failed.
- \see Epid11VerifierCreate
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11Verify(Epid11VerifierCtx const* ctx,
- Epid11Signature const* sig, size_t sig_len,
- void const* msg, size_t msg_len);
- /// Determines if two Intel(R) EPID 1.1 signatures are linked.
- /*!
- The Intel(R) EPID scheme allows signatures to be linked. If basename
- option is specified when signing signatures with the same basename will be
- linkable. This linking capability allows the verifier, or anyone, to know
- whether two Intel(R) EPID signatures are generated by the same member.
- This API supports Intel(R) EPID 1.1 verification.
- \param[in] sig1
- A basic signature.
- \param[in] sig2
- A basic signature.
- \result bool
- \retval true
- if the signatures were generated by the same member
- \retval false
- if it couldn't be determined if the signatures were generated by
- the same member
- \note
- The input signatures should be verified using Epid11VerifyBasicSig() before
- invocation. Behavior is undefined if either of the signatures cannot be
- verified.
- \see Epid11VerifyBasicSig
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- bool Epid11AreSigsLinked(Epid11BasicSignature const* sig1,
- Epid11BasicSignature const* sig2);
- /// Verifies an Intel(R) EPID 1.1 member signature without revocation checks.
- /*!
- Used in constrained environments where, due to limited memory, it may not
- be possible to process through a large and potentially unbounded revocation
- list.
- \param[in] ctx
- The verifier context.
- \param[in] sig
- The basic signature.
- \param[in] msg
- The message that was signed.
- \param[in] msg_len
- The size of msg in bytes.
- \returns ::EpidStatus
- \note
- This function should be used in conjunction with Epid11NrVerify() and
- Epid11CheckPrivRlEntry().
- \note
- If the result is not ::kEpidNoErr the verify should be considered to have
- failed.
- \see Epid11VerifierCreate
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11VerifyBasicSig(Epid11VerifierCtx const* ctx,
- Epid11BasicSignature const* sig,
- void const* msg, size_t msg_len);
- /// Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature
- /// based revocation list entry.
- /*!
- Used in constrained environments where, due to limited memory, it may not
- be possible to process through a large and potentially unbounded revocation
- list.
- This API supports Intel(R) EPID 1.1 verification.
- \param[in] ctx
- The verifier context.
- \param[in] sig
- The basic signature.
- \param[in] msg
- The message that was signed.
- \param[in] msg_len
- The size of msg in bytes.
- \param[in] sigrl_entry
- The signature based revocation list entry.
- \param[in] proof
- The non-revoked proof.
- \returns ::EpidStatus
- \note
- Sig should be verified using Epid11VerifyBasicSig() before invocation. Behavior
- is undefined if sig cannot be verified.
- \note
- This function should be used in conjunction with Epid11VerifyBasicSig() and
- Epid11CheckPrivRlEntry().
- \note
- If the result is not ::kEpidNoErr the verify should de considered to have
- failed.
- \see Epid11VerifierCreate
- \see Epid11VerifyBasicSig
- \see Epid11CheckPrivRlEntry
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11NrVerify(Epid11VerifierCtx const* ctx,
- Epid11BasicSignature const* sig, void const* msg,
- size_t msg_len, Epid11SigRlEntry const* sigrl_entry,
- Epid11NrProof const* proof);
- /// Verifies an Intel(R) EPID 1.1 signature has not been revoked in the
- /// private key based revocation list.
- /*!
- Used in constrained environments where, due to limited memory, it may not
- be possible to process through a large and potentially unbounded revocation
- list.
- This API supports Intel(R) EPID 1.1 verification.
- \param[in] ctx
- The verifier context.
- \param[in] sig
- The basic signature.
- \param[in] f
- The private key based revocation list entry.
- \note
- Sig should be verified using Epid11VerifyBasicSig() before invocation. Behavior
- is undefined if sig cannot be verified.
- \note
- This function should be used in conjunction with Epid11NrVerify() and
- Epid11VerifyBasicSig().
- \note
- If the result is not ::kEpidNoErr the verify should de considered to have
- failed.
- \returns ::EpidStatus
- \see Epid11VerifierCreate
- \see Epid11NrVerify
- \see Epid11VerifyBasicSig
- \see <a href="group___epid11_verifier_module.html#details"><b>EPID 1.1
- support</b></a>
- */
- EpidStatus Epid11CheckPrivRlEntry(Epid11VerifierCtx const* ctx,
- Epid11BasicSignature const* sig,
- FpElemStr const* f);
- #ifdef __cplusplus
- };
- #endif
- /*! @} */
- #endif // EPID_VERIFIER_1_1_API_H_
|