|
@@ -44,7 +44,7 @@ static void mod_destroy(void);
|
|
|
|
|
|
static int w_jwt_generate_4(sip_msg_t* msg, char* pkey, char* palg, char* pclaims, char* pheaders);
|
|
static int w_jwt_generate_4(sip_msg_t* msg, char* pkey, char* palg, char* pclaims, char* pheaders);
|
|
static int w_jwt_generate_3(sip_msg_t* msg, char* pkey, char* palg, char* pclaims);
|
|
static int w_jwt_generate_3(sip_msg_t* msg, char* pkey, char* palg, char* pclaims);
|
|
-static int w_jwt_verify(sip_msg_t* msg, char* pkey, char* palg, char* pclaims,
|
|
|
|
|
|
+static int w_jwt_verify(sip_msg_t* msg, char* pkeypath, char* palg, char* pclaims,
|
|
char *pjwtval);
|
|
char *pjwtval);
|
|
|
|
|
|
static int _jwt_key_mode = 0;
|
|
static int _jwt_key_mode = 0;
|
|
@@ -418,16 +418,13 @@ static int w_jwt_generate_4(sip_msg_t* msg, char* pkey, char* palg, char* pclaim
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
-static int ki_jwt_verify(sip_msg_t* msg, str *key, str *alg, str *claims,
|
|
|
|
|
|
+static int ki_jwt_verify_key(sip_msg_t* msg, str *key, str *alg, str *claims,
|
|
str *jwtval)
|
|
str *jwtval)
|
|
{
|
|
{
|
|
str dupclaims = STR_NULL;
|
|
str dupclaims = STR_NULL;
|
|
jwt_alg_t valg = JWT_ALG_NONE;
|
|
jwt_alg_t valg = JWT_ALG_NONE;
|
|
str kdata = STR_NULL;
|
|
str kdata = STR_NULL;
|
|
time_t iat;
|
|
time_t iat;
|
|
- FILE *fpk = NULL;
|
|
|
|
- unsigned char keybuf[10240];
|
|
|
|
- size_t keybuf_len = 0;
|
|
|
|
param_t* params_list = NULL;
|
|
param_t* params_list = NULL;
|
|
param_hooks_t phooks;
|
|
param_hooks_t phooks;
|
|
param_t *pit = NULL;
|
|
param_t *pit = NULL;
|
|
@@ -446,6 +443,8 @@ static int ki_jwt_verify(sip_msg_t* msg, str *key, str *alg, str *claims,
|
|
|
|
|
|
_jwt_verify_status = 0;
|
|
_jwt_verify_status = 0;
|
|
|
|
|
|
|
|
+ kdata = *key;
|
|
|
|
+ trim(&kdata);
|
|
valg = jwt_str_alg(alg->s);
|
|
valg = jwt_str_alg(alg->s);
|
|
if (valg == JWT_ALG_INVAL) {
|
|
if (valg == JWT_ALG_INVAL) {
|
|
LM_ERR("not supported algorithm: %s\n", alg->s);
|
|
LM_ERR("not supported algorithm: %s\n", alg->s);
|
|
@@ -455,25 +454,6 @@ static int ki_jwt_verify(sip_msg_t* msg, str *key, str *alg, str *claims,
|
|
LM_ERR("failed to duplicate claims\n");
|
|
LM_ERR("failed to duplicate claims\n");
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- jwt_fcache_get(key, &kdata);
|
|
|
|
- if(kdata.s==NULL) {
|
|
|
|
- fpk= fopen(key->s, "r");
|
|
|
|
- if(fpk==NULL) {
|
|
|
|
- LM_ERR("failed to read key file: %s\n", key->s);
|
|
|
|
- goto error;
|
|
|
|
- }
|
|
|
|
- keybuf_len = fread(keybuf, 1, sizeof(keybuf), fpk);
|
|
|
|
- fclose(fpk);
|
|
|
|
- if(keybuf_len==0) {
|
|
|
|
- LM_ERR("unable to read key file content: %s\n", key->s);
|
|
|
|
- goto error;
|
|
|
|
- }
|
|
|
|
- kdata.s = (char*)keybuf;
|
|
|
|
- kdata.len = (int)keybuf_len;
|
|
|
|
- trim(&kdata);
|
|
|
|
- kdata.s[keybuf_len] = '\0';
|
|
|
|
- jwt_fcache_add(key, &kdata);
|
|
|
|
- }
|
|
|
|
sparams = dupclaims;
|
|
sparams = dupclaims;
|
|
if(sparams.s[sparams.len-1]==';') {
|
|
if(sparams.s[sparams.len-1]==';') {
|
|
sparams.len--;
|
|
sparams.len--;
|
|
@@ -548,15 +528,55 @@ error:
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
-static int w_jwt_verify(sip_msg_t* msg, char* pkey, char* palg, char* pclaims,
|
|
|
|
|
|
+static int ki_jwt_verify(sip_msg_t* msg, str *keypath, str *alg, str *claims,
|
|
|
|
+ str *jwtval)
|
|
|
|
+{
|
|
|
|
+ str kdata = STR_NULL;
|
|
|
|
+ FILE *fpk = NULL;
|
|
|
|
+ unsigned char keybuf[10240];
|
|
|
|
+ size_t keybuf_len = 0;
|
|
|
|
+
|
|
|
|
+ if(keypath==NULL || keypath->s==NULL || alg==NULL || alg->s==NULL
|
|
|
|
+ || claims==NULL || claims->s==NULL || claims->len<=0
|
|
|
|
+ || jwtval==NULL || jwtval->s==NULL || jwtval->len<=0) {
|
|
|
|
+ LM_ERR("invalid parameters\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ jwt_fcache_get(keypath, &kdata);
|
|
|
|
+ if(kdata.s==NULL) {
|
|
|
|
+ fpk= fopen(keypath->s, "r");
|
|
|
|
+ if(fpk==NULL) {
|
|
|
|
+ LM_ERR("failed to read key file: %s\n", keypath->s);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ keybuf_len = fread(keybuf, 1, sizeof(keybuf), fpk);
|
|
|
|
+ fclose(fpk);
|
|
|
|
+ if(keybuf_len==0) {
|
|
|
|
+ LM_ERR("unable to read key file content: %s\n", keypath->s);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ kdata.s = (char*)keybuf;
|
|
|
|
+ kdata.len = (int)keybuf_len;
|
|
|
|
+ trim(&kdata);
|
|
|
|
+ kdata.s[keybuf_len] = '\0';
|
|
|
|
+ jwt_fcache_add(keypath, &kdata);
|
|
|
|
+ }
|
|
|
|
+ return ki_jwt_verify_key(msg, &kdata, alg, claims, jwtval);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+static int w_jwt_verify(sip_msg_t* msg, char* pkeypath, char* palg, char* pclaims,
|
|
char *pjwtval)
|
|
char *pjwtval)
|
|
{
|
|
{
|
|
- str skey = STR_NULL;
|
|
|
|
|
|
+ str skeypath = STR_NULL;
|
|
str salg = STR_NULL;
|
|
str salg = STR_NULL;
|
|
str sclaims = STR_NULL;
|
|
str sclaims = STR_NULL;
|
|
str sjwtval = STR_NULL;
|
|
str sjwtval = STR_NULL;
|
|
|
|
|
|
- if (fixup_get_svalue(msg, (gparam_t*)pkey, &skey) != 0) {
|
|
|
|
|
|
+ if (fixup_get_svalue(msg, (gparam_t*)pkeypath, &skeypath) != 0) {
|
|
LM_ERR("cannot get path to the key file\n");
|
|
LM_ERR("cannot get path to the key file\n");
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -573,7 +593,7 @@ static int w_jwt_verify(sip_msg_t* msg, char* pkey, char* palg, char* pclaims,
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
- return ki_jwt_verify(msg, &skey, &salg, &sclaims, &sjwtval);
|
|
|
|
|
|
+ return ki_jwt_verify(msg, &skeypath, &salg, &sclaims, &sjwtval);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|