1 /**
2  * @addtogroup MCD_MCDIMPL_DAEMON_REG
3  * @{
4  * G&D MobiCore Registry
5  *
6  * @file
7  * Mobicore Driver Registry.
8  *
9  * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 -->
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote
20  *    products derived from this software without specific prior
21  *    written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
24  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
27  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 #ifndef MOBICORE_REGISTRY_H_
36 #define MOBICORE_REGISTRY_H_
37 
38 #include "MobiCoreDriverApi.h"
39 #include "mcContainer.h"
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45     /**
46      * Registry object.
47      */
48     typedef struct {
49         uint32_t len;
50         uint8_t value[];
51     } regObject_t;
52 
53     /** Maximum size of a trustlet in bytes. */
54 #define MAX_TL_SIZE     (1 * 1024 * 1024)
55 
56 //-----------------------------------------------------------------
57 
58     /** Stores an authentication token in registry.
59      * @param  so Authentication token secure object.
60      * @return MC_DRV_OK if successful, otherwise error code.
61      */
62     mcResult_t mcRegistryStoreAuthToken(const mcSoAuthTokenCont_t *so);
63 
64     /** Reads an authentication token from registry.
65      * @param[out] so Authentication token secure object.
66      * @return MC_DRV_OK if successful, otherwise error code.
67      */
68     mcResult_t mcRegistryReadAuthToken(mcSoAuthTokenCont_t *so);
69 
70     /** Deletes the authentication token secure object from the registry.
71      * @return MC_DRV_OK if successful, otherwise error code.
72      */
73     mcResult_t mcRegistryDeleteAuthToken(void);
74 
75     /** Stores a root container secure object in the registry.
76      * @param so Root container secure object.
77      * @return MC_DRV_OK if successful, otherwise error code.
78      */
79     mcResult_t mcRegistryStoreRoot(const mcSoRootCont_t *so);
80 
81     /** Reads a root container secure object from the registry.
82      * @param[out] so Root container secure object.
83      * @return MC_DRV_OK if successful, otherwise error code.
84      */
85     mcResult_t mcRegistryReadRoot(mcSoRootCont_t *so);
86 
87     /** Stores a service provider container secure object in the registry.
88      * @param spid Service provider ID.
89      * @param so Service provider container secure object.
90      * @return MC_DRV_OK if successful, otherwise error code.
91      */
92     mcResult_t mcRegistryStoreSp(mcSpid_t spid, const mcSoSpCont_t *so);
93 
94     /** Reads a service provider container secure object from the registry.
95      * @param spid Service provider ID.
96      * @param[out] so Service provider container secure object.
97      * @return MC_DRV_OK if successful, otherwise error code.
98      */
99     mcResult_t mcRegistryReadSp(mcSpid_t spid, mcSoSpCont_t *so);
100 
101     /** Deletes a service provider recursively, including all trustlets and
102      * data.
103      * @param spid Service provider ID.
104      * @return MC_DRV_OK if successful, otherwise error code.
105      */
106     mcResult_t mcRegistryCleanupSp(mcSpid_t spid);
107 
108     /** Stores a trustlet container secure object in the registry.
109      * @param uuid Trustlet UUID.
110      * @param so Trustlet container secure object.
111      * @return MC_DRV_OK if successful, otherwise error code.
112      */
113     mcResult_t mcRegistryStoreTrustletCon(const mcUuid_t *uuid, const mcSoTltCont_t *so);
114 
115     /** Reads a trustlet container secure object from the registry.
116      * @param uuid Trustlet UUID.
117      * @param[out] so Trustlet container secure object.
118      * @return MC_DRV_OK if successful, otherwise error code.
119      */
120     mcResult_t mcRegistryReadTrustletCon(const mcUuid_t *uuid, mcSoTltCont_t *so);
121 
122     /** Deletes a trustlet container secure object and all of its associated data.
123      * @param uuid Trustlet UUID.
124      * @return MC_DRV_OK if successful, otherwise error code.
125      */
126     mcResult_t mcRegistryCleanupTrustlet(const mcUuid_t *uuid);
127 
128     /** Stores a data container secure object in the registry.
129      * @param so Data container secure object.
130      * @return MC_DRV_OK if successful, otherwise error code.
131      */
132     mcResult_t mcRegistryStoreData(const mcSoDataCont_t *so);
133 
134     /** Reads a data container secure object from the registry.
135      * @param context (service provider = 0; trustlet = 1).
136      * @param cid Service provider or UUID.
137      * @param pid Personalization data identifier.
138      * @param[out] so Data container secure object.
139      * @param maxLen Maximum size (in bytes) of the destination buffer (so).
140      * @return MC_DRV_OK if successful, otherwise error code.
141      */
142     mcResult_t mcRegistryReadData(
143         uint32_t context,
144         const mcCid_t *cid,
145         mcPid_t pid,
146         mcSoDataCont_t *so,
147         uint32_t maxLen
148     );
149 
150     /** Deletes the root container and all of its associated service provider
151      * containers.
152      * @return MC_DRV_OK if successful, otherwise error code.
153      */
154     mcResult_t mcRegistryCleanupRoot(void);
155 
156     /** Returns a registry object for a given service.
157      * @param uuid service UUID
158      * @return Registry object.
159      * @note It is the responsibility of the caller to free the registry object
160      * allocated by this function.
161      */
162     regObject_t *mcRegistryGetServiceBlob(const mcUuid_t  *uuid);
163 
164     /** Returns a registry object for a given service.
165      * @param driverFilename driver filename
166      * @return Registry object.
167      * @note It is the responsibility of the caller to free the registry object
168      * allocated by this function.
169      */
170     regObject_t *mcRegistryGetDriverBlob(const char *driverFilename);
171 
172 #ifdef __cplusplus
173 }
174 #endif
175 
176 #endif // MOBICORE_REGISTRY_H_
177 
178 /** @} */
179