add changelog
[oweals/gnunet.git] / src / reclaim / oidc_helper.h
1 /*
2    This file is part of GNUnet
3    Copyright (C) 2010-2015 GNUnet e.V.
4
5    GNUnet is free software: you can redistribute it and/or modify it
6    under the terms of the GNU Affero General Public License as published
7    by the Free Software Foundation, either version 3 of the License,
8    or (at your option) any later version.
9
10    GNUnet is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Affero General Public License for more details.
14
15    You should have received a copy of the GNU Affero General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18    SPDX-License-Identifier: AGPL3.0-or-later
19  */
20
21 /**
22  * @file reclaim/oidc_helper.h
23  * @brief helper library for OIDC related functions
24  * @author Martin Schanzenbach
25  */
26
27 #ifndef JWT_H
28 #define JWT_H
29
30 #define JWT_ALG "alg"
31
32 /* Use 512bit HMAC */
33 #define JWT_ALG_VALUE "HS512"
34
35 #define JWT_TYP "typ"
36
37 #define JWT_TYP_VALUE "jwt"
38
39 #define SERVER_ADDRESS "https://api.reclaim"
40
41 /**
42  * Create a JWT from attributes
43  *
44  * @param aud_key the public of the audience
45  * @param sub_key the public key of the subject
46  * @param attrs the attribute list
47  * @param expiration_time the validity of the token
48  * @param secret_key the key used to sign the JWT
49  * @return a new base64-encoded JWT string.
50  */
51 char*
52 OIDC_id_token_new (const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
53                    const struct GNUNET_CRYPTO_EcdsaPublicKey *sub_key,
54                    const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs,
55                    const struct GNUNET_TIME_Relative *expiration_time,
56                    const char *nonce,
57                    const char *secret_key);
58
59 /**
60  * Builds an OIDC authorization code including
61  * a reclaim ticket and nonce
62  *
63  * @param issuer the issuer of the ticket, used to sign the ticket and nonce
64  * @param ticket the ticket to include in the code
65  * @param attrs list of attributes to share
66  * @param nonce the nonce to include in the code
67  * @param code_challenge PKCE code challenge
68  * @return a new authorization code (caller must free)
69  */
70 char*
71 OIDC_build_authz_code (const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
72                        const struct GNUNET_RECLAIM_Ticket *ticket,
73                        struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs,
74                        const char *nonce,
75                        const char *code_challenge);
76
77 /**
78  * Parse reclaim ticket and nonce from
79  * authorization code.
80  * This also verifies the signature in the code.
81  *
82  * @param ecdsa_priv the audience of the ticket
83  * @param code the string representation of the code
84  * @param code_verfier PKCE code verifier
85  * @param ticket where to store the ticket
86  * @param attrs the attributes found in the code
87  * @param nonce where to store the nonce
88  * @return GNUNET_OK if successful, else GNUNET_SYSERR
89  */
90 int
91 OIDC_parse_authz_code (const struct GNUNET_CRYPTO_EcdsaPrivateKey *ecdsa_priv,
92                        const char *code,
93                        const char *code_verifier,
94                        struct GNUNET_RECLAIM_Ticket *ticket,
95                        struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList **attrs,
96                        char **nonce);
97
98 /**
99  * Build a token response for a token request
100  * TODO: Maybe we should add the scope here?
101  *
102  * @param access_token the access token to include
103  * @param id_token the id_token to include
104  * @param expiration_time the expiration time of the token(s)
105  * @param token_response where to store the response
106  */
107 void
108 OIDC_build_token_response (const char *access_token,
109                            const char *id_token,
110                            const struct GNUNET_TIME_Relative *expiration_time,
111                            char **token_response);
112
113 /**
114  * Generate a new access token
115  */
116 char*
117 OIDC_access_token_new ();
118
119
120 #endif