test_api_cvss.c | test_api_cvss.c | |||
---|---|---|---|---|
#include "config.h" | #include "config.h" | |||
#include <stdio.h> | #include <stdio.h> | |||
#include <stdlib.h> | #include <stdlib.h> | |||
#include <math.h> | #include <math.h> | |||
#include <string.h> | #include <string.h> | |||
#include <cvss.h> | #include <cvss.h> | |||
#define EPS (0.000001) | static void print_score(float s) | |||
void print_usage(FILE *, char *); | ||||
double base_score(cvss_access_vector_t, | ||||
cvss_access_complexity_t, | ||||
cvss_authentication_t, | ||||
cvss_conf_impact_t, | ||||
cvss_integ_impact_t, | ||||
cvss_avail_impact_t); | ||||
double temp_score(cvss_exploitability_t, | ||||
cvss_remediation_level_t, | ||||
cvss_report_confidence_t, | ||||
double); | ||||
double env_score(cvss_collateral_damage_potential_t, | ||||
cvss_target_distribution_t, | ||||
cvss_conf_req_t, | ||||
cvss_integ_req_t, | ||||
cvss_avail_req_t, | ||||
cvss_access_vector_t, | ||||
cvss_access_complexity_t, | ||||
cvss_authentication_t, | ||||
cvss_conf_impact_t, | ||||
cvss_integ_impact_t, | ||||
cvss_avail_impact_t, | ||||
cvss_exploitability_t, | ||||
cvss_remediation_level_t, | ||||
cvss_report_confidence_t); | ||||
int main(int argc, char *argv[]) | ||||
{ | ||||
double base_score_a, base_score_b; | ||||
double temp_score_a, temp_score_b; | ||||
double env_score_a, env_score_b; | ||||
cvss_access_vector_t ave; | ||||
cvss_access_complexity_t ace; | ||||
cvss_authentication_t aue; | ||||
cvss_conf_impact_t cie; | ||||
cvss_integ_impact_t iie; | ||||
cvss_avail_impact_t aie; | ||||
cvss_exploitability_t exe; | ||||
cvss_remediation_level_t rle; | ||||
cvss_report_confidence_t rce; | ||||
cvss_collateral_damage_potential_t cde; | ||||
cvss_target_distribution_t tde; | ||||
cvss_conf_req_t cre; | ||||
cvss_integ_req_t ire; | ||||
cvss_avail_req_t are; | ||||
int ret_val = 0; | ||||
if (argc == 1) { | ||||
print_usage(stdout, argv[0]); | ||||
ret_val = 0; | ||||
} | ||||
else if (argc == 8 && !strcmp(argv[1], "--base")) { | ||||
if (!strcmp(argv[2], "AV_LOCAL")) ave = AV_LOCAL; | ||||
if (!strcmp(argv[2], "AV_ADJACENT_NETWORK")) ave = AV_ADJACENT_NETWORK; | ||||
if (!strcmp(argv[2], "AV_NETWORK")) ave = AV_NETWORK; | ||||
if (!strcmp(argv[3], "AC_HIGH")) ace = AC_HIGH; | ||||
if (!strcmp(argv[3], "AC_MEDIUM")) ace = AC_MEDIUM; | ||||
if (!strcmp(argv[3], "AC_LOW")) ace = AC_LOW; | ||||
if (!strcmp(argv[4], "AU_NONE")) aue = AU_NONE; | ||||
if (!strcmp(argv[4], "AU_SINGLE_INSTANCE")) aue = AU_SINGLE_INSTANCE; | ||||
if (!strcmp(argv[4], "AU_MULTIPLE_INSTANCE")) aue = AU_MULTIPLE_INSTANC | ||||
E; | ||||
if (!strcmp(argv[5], "CI_NONE")) cie = CI_NONE; | ||||
if (!strcmp(argv[5], "CI_PARTIAL")) cie = CI_PARTIAL; | ||||
if (!strcmp(argv[5], "CI_COMPLETE")) cie = CI_COMPLETE; | ||||
if (!strcmp(argv[6], "II_NONE")) iie = II_NONE; | ||||
if (!strcmp(argv[6], "II_PARTIAL")) iie = II_PARTIAL; | ||||
if (!strcmp(argv[6], "II_COMPLETE")) iie = II_COMPLETE; | ||||
if (!strcmp(argv[7], "AI_NONE")) aie = AI_NONE; | ||||
if (!strcmp(argv[7], "AI_PARTIAL")) aie = AI_PARTIAL; | ||||
if (!strcmp(argv[7], "AI_COMPLETE")) aie = AI_COMPLETE; | ||||
cvss_base_score(ave, ace, aue, cie, iie, aie, &base_score_a, NULL, NULL | ||||
); | ||||
base_score_b = base_score(ave, ace, aue, cie, iie, aie); | ||||
ret_val = fabs(base_score_a - base_score_b) < EPS ? 0 : 1; | ||||
fprintf(ret_val ? stderr : stdout, | ||||
"BS=%f [%f] (%s %s %s %s %s %s)\n", base_score_a, base_score_b, | ||||
argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); | ||||
} | ||||
else if (argc == 6 && !strcmp(argv[1], "--temporal")) { | ||||
if (!strcmp(argv[2], "EX_UNPROVEN")) exe = EX_UNPROVEN; | ||||
if (!strcmp(argv[2], "EN_PROOF_OF_CONCEPT")) exe = EX_PROOF_OF_CONCEPT; | ||||
if (!strcmp(argv[2], "EX_FUNCTIONAL")) exe = EX_FUNCTIONAL; | ||||
if (!strcmp(argv[2], "EX_HIGH")) exe = EX_HIGH; | ||||
if (!strcmp(argv[2], "EX_NOT_DEFINED")) exe = EX_NOT_DEFINED; | ||||
if (!strcmp(argv[3], "RL_OFFICIAL_FIX")) rle = RL_OFFICIAL_FIX; | ||||
if (!strcmp(argv[3], "RL_TEMPORARY_FIX")) rle = RL_TEMPORARY_FIX; | ||||
if (!strcmp(argv[3], "RL_WORKAROUND")) rle = RL_WORKAROUND; | ||||
if (!strcmp(argv[3], "RL_UNAVAILABLE")) rle = RL_UNAVAILABLE; | ||||
if (!strcmp(argv[3], "RL_NOT_DEFINED")) rle = RL_NOT_DEFINED; | ||||
if (!strcmp(argv[4], "RC_UNCONFIRMED")) rce = RC_UNCONFIRMED; | ||||
if (!strcmp(argv[4], "RC_UNCORROBORATED")) rce = RC_UNCORROBORATED; | ||||
if (!strcmp(argv[4], "RC_CONFIRMED")) rce = RC_CONFIRMED; | ||||
if (!strcmp(argv[4], "RC_NOT_DEFINED")) rce = RC_NOT_DEFINED; | ||||
cvss_temp_score(exe, rle, rce, atof(argv[5]), &temp_score_a); | ||||
temp_score_b = temp_score(exe, rle, rce, atof(argv[5])); | ||||
ret_val = fabs(temp_score_a - temp_score_b) < EPS ? 0 : 1; | ||||
fprintf(ret_val ? stderr : stdout, | ||||
"TS=%f [%f] (%s %s %s %s)\n", temp_score_a, temp_score_b, | ||||
argv[2], argv[3], argv[4], argv[5]); | ||||
} | ||||
else if (argc == 16 && !strcmp(argv[1], "--enviromental")) { | ||||
if (!strcmp(argv[2], "CD_NONE")) cde = CD_NONE; | ||||
if (!strcmp(argv[2], "CD_LOW")) cde = CD_LOW; | ||||
if (!strcmp(argv[2], "CD_LOW_MEDIUM")) cde = CD_LOW_MEDIUM; | ||||
if (!strcmp(argv[2], "CD_MEDIUM_HIGH")) cde = CD_MEDIUM_HIGH; | ||||
if (!strcmp(argv[2], "CD_HIGH")) cde = CD_HIGH; | ||||
if (!strcmp(argv[2], "CD_NOT_DEFINED")) cde = CD_NOT_DEFINED; | ||||
if (!strcmp(argv[3], "TD_NONE")) tde = TD_NONE; | ||||
if (!strcmp(argv[3], "TD_LOW")) tde = TD_LOW; | ||||
if (!strcmp(argv[3], "TD_MEDIUM")) tde = TD_MEDIUM; | ||||
if (!strcmp(argv[3], "TD_HIGH")) tde = TD_HIGH; | ||||
if (!strcmp(argv[3], "TD_NOT_DEFINED")) tde = TD_NOT_DEFINED; | ||||
if (!strcmp(argv[4], "CR_LOW")) cre = CR_LOW; | ||||
if (!strcmp(argv[4], "CR_MEDIUM")) cre = CR_MEDIUM; | ||||
if (!strcmp(argv[4], "CR_HIGH")) cre = CR_HIGH; | ||||
if (!strcmp(argv[4], "CR_NOT_DEFINED")) cre = CR_NOT_DEFINED; | ||||
if (!strcmp(argv[5], "IR_LOW")) ire = IR_LOW; | ||||
if (!strcmp(argv[5], "IR_MEDIUM")) ire = IR_MEDIUM; | ||||
if (!strcmp(argv[5], "IR_HIGH")) ire = IR_HIGH; | ||||
if (!strcmp(argv[5], "IR_NOT_DEFINED")) ire = IR_NOT_DEFINED; | ||||
if (!strcmp(argv[6], "AR_LOW")) are = AR_LOW; | ||||
if (!strcmp(argv[6], "AR_MEDIUM")) are = AR_MEDIUM; | ||||
if (!strcmp(argv[6], "AR_HIGH")) are = AR_HIGH; | ||||
if (!strcmp(argv[6], "AR_NOT_DEFINED")) are = AR_NOT_DEFINED; | ||||
if (!strcmp(argv[7], "AV_LOCAL")) ave = AV_LOCAL; | ||||
if (!strcmp(argv[7], "AV_ADJACENT_NETWORK")) ave = AV_ADJACENT_NETWORK; | ||||
if (!strcmp(argv[7], "AV_NETWORK")) ave = AV_NETWORK; | ||||
if (!strcmp(argv[8], "AC_HIGH")) ace = AC_HIGH; | ||||
if (!strcmp(argv[8], "AC_MEDIUM")) ace = AC_MEDIUM; | ||||
if (!strcmp(argv[8], "AC_LOW")) ace = AC_LOW; | ||||
if (!strcmp(argv[9], "AU_NONE")) aue = AU_NONE; | ||||
if (!strcmp(argv[9], "AU_SINGLE_INSTANCE")) aue = AU_SINGLE_INSTANCE; | ||||
if (!strcmp(argv[9], "AU_MULTIPLE_INSTANCE")) aue = AU_MULTIPLE_INSTANC | ||||
E; | ||||
if (!strcmp(argv[10], "CI_NONE")) cie = CI_NONE; | ||||
if (!strcmp(argv[10], "CI_PARTIAL")) cie = CI_PARTIAL; | ||||
if (!strcmp(argv[10], "CI_COMPLETE")) cie = CI_COMPLETE; | ||||
if (!strcmp(argv[11], "II_NONE")) iie = II_NONE; | ||||
if (!strcmp(argv[11], "II_PARTIAL")) iie = II_PARTIAL; | ||||
if (!strcmp(argv[11], "II_COMPLETE")) iie = II_COMPLETE; | ||||
if (!strcmp(argv[12], "AI_NONE")) aie = AI_NONE; | ||||
if (!strcmp(argv[12], "AI_PARTIAL")) aie = AI_PARTIAL; | ||||
if (!strcmp(argv[12], "AI_COMPLETE")) aie = AI_COMPLETE; | ||||
if (!strcmp(argv[13], "EX_UNPROVEN")) exe = EX_UNPROVEN; | ||||
if (!strcmp(argv[13], "EN_PROOF_OF_CONCEPT")) exe = EX_PROOF_OF_CONCEPT | ||||
; | ||||
if (!strcmp(argv[13], "EX_FUNCTIONAL")) exe = EX_FUNCTIONAL; | ||||
if (!strcmp(argv[13], "EX_HIGH")) exe = EX_HIGH; | ||||
if (!strcmp(argv[13], "EX_NOT_DEFINED")) exe = EX_NOT_DEFINED; | ||||
if (!strcmp(argv[14], "RL_OFFICIAL_FIX")) rle = RL_OFFICIAL_FIX; | ||||
if (!strcmp(argv[14], "RL_TEMPORARY_FIX")) rle = RL_TEMPORARY_FIX; | ||||
if (!strcmp(argv[14], "RL_WORKAROUND")) rle = RL_WORKAROUND; | ||||
if (!strcmp(argv[14], "RL_UNAVAILABLE")) rle = RL_UNAVAILABLE; | ||||
if (!strcmp(argv[14], "RL_NOT_DEFINED")) rle = RL_NOT_DEFINED; | ||||
if (!strcmp(argv[15], "RC_UNCONFIRMED")) rce = RC_UNCONFIRMED; | ||||
if (!strcmp(argv[15], "RC_UNCORROBORATED")) rce = RC_UNCORROBORATED; | ||||
if (!strcmp(argv[15], "RC_CONFIRMED")) rce = RC_CONFIRMED; | ||||
if (!strcmp(argv[15], "RC_NOT_DEFINED")) rce = RC_NOT_DEFINED; | ||||
cvss_env_score(cde, tde, cre, ire, are, ave, ace, aue, cie, iie, aie, e | ||||
xe, rle, rce, &env_score_a); | ||||
env_score_b = env_score(cde, tde, cre, ire, are, ave, ace, aue, cie, ii | ||||
e, aie, exe, rle, rce); | ||||
ret_val = fabs(env_score_a - env_score_b) < EPS ? 0 : 1; | ||||
fprintf(ret_val ? stderr : stdout, | ||||
"ES=%f [%f] (%s %s %s %s %s %s %s %s %s %s %s %s %s %s)\n", | ||||
env_score_a, env_score_b, | ||||
argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], | ||||
argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], | ||||
argv[14], argv[15]); | ||||
} | ||||
else { | ||||
print_usage(stderr, argv[0]); | ||||
ret_val = 1; | ||||
} | ||||
return ret_val; | ||||
} | ||||
void print_usage(FILE *out, char *program_name) | ||||
{ | { | |||
fprintf(out, "Usage: \n\n" | if (isnan(s)) printf("/-"); | |||
"%s --base AVE ACE AUE CIE IIE AIE\n" | else printf("/%.1f", s); | |||
"%s --temporary EXE RLE RCE BASE_SCORE\n" | ||||
"%s --enviromental CDE TDE CRE IRE ARE AVE ACE AUE CIE IIE AIE EXE | ||||
RLE RCE\n", | ||||
program_name, program_name, program_name); | ||||
} | ||||
double base_score(cvss_access_vector_t ave, | ||||
cvss_access_complexity_t ace, | ||||
cvss_authentication_t aue, | ||||
cvss_conf_impact_t cie, | ||||
cvss_integ_impact_t iie, | ||||
cvss_avail_impact_t aie) | ||||
{ | ||||
double ave_d = 0, ace_d = 0, aue_d = 0, cie_d = 0, | ||||
iie_d = 0, aie_d = 0, exp_d = 0, imp_d = 0, score = 0; | ||||
switch (ave) { | ||||
case AV_LOCAL: | ||||
ave_d=0.395; | ||||
break; | ||||
case AV_ADJACENT_NETWORK: | ||||
ave_d=0.646; | ||||
break; | ||||
case AV_NETWORK: | ||||
ave_d=1.0; | ||||
break; | ||||
} | ||||
switch (ace) { | ||||
case AC_HIGH: | ||||
ace_d=0.35; | ||||
break; | ||||
case AC_MEDIUM: | ||||
ace_d=0.61; | ||||
break; | ||||
case AC_LOW: | ||||
ace_d=0.71; | ||||
break; | ||||
} | ||||
switch (aue) { | ||||
case AU_NONE: | ||||
aue_d=0.704; | ||||
break; | ||||
case AU_SINGLE_INSTANCE: | ||||
aue_d=0.56; | ||||
break; | ||||
case AU_MULTIPLE_INSTANCE: | ||||
aue_d=0.45; | ||||
break; | ||||
} | ||||
switch (cie) { | ||||
case CI_NONE: | ||||
cie_d=0; | ||||
break; | ||||
case CI_PARTIAL: | ||||
cie_d=0.275; | ||||
break; | ||||
case CI_COMPLETE: | ||||
cie_d=0.660; | ||||
break; | ||||
} | ||||
switch (iie) { | ||||
case II_NONE: | ||||
iie_d=0; | ||||
break; | ||||
case II_PARTIAL: | ||||
iie_d=0.275; | ||||
break; | ||||
case II_COMPLETE: | ||||
iie_d=0.660; | ||||
break; | ||||
} | ||||
switch (aie) { | ||||
case AI_NONE: | ||||
aie_d=0; | ||||
break; | ||||
case AI_PARTIAL: | ||||
aie_d=0.275; | ||||
break; | ||||
case AI_COMPLETE: | ||||
aie_d=0.660; | ||||
break; | ||||
} | ||||
exp_d = 20.0 * ave_d * ace_d * aue_d; | ||||
imp_d = 10.41 *(1.0 - (1.0 - cie_d) * (1.0 - iie_d) * (1.0 - aie_d)); | ||||
score = ((0.6 * imp_d) + (0.4 * exp_d) - 1.5) * (fabs(imp_d) < EPS ? 0.0 | ||||
: 1.176); | ||||
score = round(score / 0.1) * 0.1; | ||||
return score; | ||||
} | } | |||
double temp_score(cvss_exploitability_t exe, | int main(int argc, char *argv[]) | |||
cvss_remediation_level_t rle, | ||||
cvss_report_confidence_t rce, | ||||
double b_score) | ||||
{ | ||||
double exe_d = 0, rle_d = 0, rce_d = 0, score = 0; | ||||
switch (exe) { | ||||
case EX_UNPROVEN: | ||||
exe_d = 0.85; | ||||
break; | ||||
case EX_PROOF_OF_CONCEPT: | ||||
exe_d = 0.9; | ||||
break; | ||||
case EX_FUNCTIONAL: | ||||
exe_d = 0.95; | ||||
break; | ||||
case EX_HIGH: | ||||
exe_d = 1.0; | ||||
break; | ||||
case EX_NOT_DEFINED: | ||||
exe_d = 1.0; | ||||
break; | ||||
} | ||||
switch (rle) { | ||||
case RL_OFFICIAL_FIX: | ||||
rle_d = 0.87; | ||||
break; | ||||
case RL_TEMPORARY_FIX: | ||||
rle_d = 0.9; | ||||
break; | ||||
case RL_WORKAROUND: | ||||
rle_d = 0.95; | ||||
break; | ||||
case RL_UNAVAILABLE: | ||||
rle_d = 1.0; | ||||
break; | ||||
case RL_NOT_DEFINED: | ||||
rle_d = 1.0; | ||||
break; | ||||
} | ||||
switch (rce) { | ||||
case RC_UNCONFIRMED: | ||||
rce_d = 0.9; | ||||
break; | ||||
case RC_UNCORROBORATED: | ||||
rce_d = 0.95; | ||||
break; | ||||
case RC_CONFIRMED: | ||||
rce_d = 1.0; | ||||
break; | ||||
case RC_NOT_DEFINED: | ||||
rce_d = 1.0; | ||||
break; | ||||
} | ||||
score = round((b_score * exe_d * rle_d * rce_d) / 0.1) * 0.1; | ||||
return score; | ||||
} | ||||
double env_score(cvss_collateral_damage_potential_t cde, | ||||
cvss_target_distribution_t tde, | ||||
cvss_conf_req_t cre, | ||||
cvss_integ_req_t ire, | ||||
cvss_avail_req_t are, | ||||
cvss_access_vector_t ave, | ||||
cvss_access_complexity_t ace, | ||||
cvss_authentication_t aue, | ||||
cvss_conf_impact_t cie, | ||||
cvss_integ_impact_t iie, | ||||
cvss_avail_impact_t aie, | ||||
cvss_exploitability_t exe, | ||||
cvss_remediation_level_t rle, | ||||
cvss_report_confidence_t rce) | ||||
{ | { | |||
double cde_d = 0, tde_d = 0, cre_d = 0, ire_d = 0, are_d = 0, ave_d = 0, | if (argc != 2) { | |||
ace_d = 0, aue_d = 0, cie_d = 0, iie_d = 0, aie_d = 0, exe_d = 0, | fprintf(stderr, "Usage: %s cvss_vector\n", argv[0]); | |||
rle_d = 0, rce_d = 0, bas_d = 0, score = 0, exp_d = 0, imp_d = 0, | return -1; | |||
adt_d = 0; | } | |||
switch (cde) { | struct cvss_impact *imp = cvss_impact_new_from_vector(argv[1]); | |||
case CD_NONE: | ||||
cde_d = 0.0; | if (imp == NULL) { | |||
break; | printf("NULL"); | |||
case CD_LOW: | return 0; | |||
cde_d = 0.1; | } | |||
break; | ||||
case CD_LOW_MEDIUM: | print_score(cvss_impact_base_score(imp)); | |||
cde_d = 0.3; | print_score(cvss_impact_temporal_score(imp)); | |||
break; | print_score(cvss_impact_environmental_score(imp)); | |||
case CD_MEDIUM_HIGH: | printf("/\n"); | |||
cde_d = 0.4; | ||||
break; | ||||
case CD_HIGH: | ||||
cde_d = 0.5; | ||||
break; | ||||
case CD_NOT_DEFINED: | ||||
cde_d = 0.0; | ||||
break; | ||||
} | ||||
switch (tde) { | ||||
case TD_NONE: | ||||
tde_d = 0.0; | ||||
break; | ||||
case TD_LOW: | ||||
tde_d = 0.25; | ||||
break; | ||||
case TD_MEDIUM: | ||||
tde_d = 0.75; | ||||
break; | ||||
case TD_HIGH: | ||||
tde_d = 1.0; | ||||
break; | ||||
case TD_NOT_DEFINED: | ||||
tde_d = 1.0; | ||||
break; | ||||
} | ||||
switch (cre) { | ||||
case CR_LOW: | ||||
cre_d = 0.5; | ||||
break; | ||||
case CR_MEDIUM: | ||||
cre_d = 1.0; | ||||
break; | ||||
case CR_HIGH: | ||||
cre_d = 1.51; | ||||
break; | ||||
case CR_NOT_DEFINED: | ||||
cre_d = 1.0; | ||||
break; | ||||
} | ||||
switch (ire) { | ||||
case IR_LOW: | ||||
ire_d = 0.5; | ||||
break; | ||||
case IR_MEDIUM: | ||||
ire_d = 1.0; | ||||
break; | ||||
case IR_HIGH: | ||||
ire_d = 1.51; | ||||
break; | ||||
case IR_NOT_DEFINED: | ||||
ire_d = 1.0; | ||||
break; | ||||
} | ||||
switch (are) { | ||||
case AR_LOW: | ||||
are_d = 0.5; | ||||
break; | ||||
case AR_MEDIUM: | ||||
are_d = 1.0; | ||||
break; | ||||
case AR_HIGH: | ||||
are_d = 1.51; | ||||
break; | ||||
case AR_NOT_DEFINED: | ||||
are_d = 1.0; | ||||
break; | ||||
} | ||||
switch (ave) { | ||||
case AV_LOCAL: | ||||
ave_d=0.395; | ||||
break; | ||||
case AV_ADJACENT_NETWORK: | ||||
ave_d=0.646; | ||||
break; | ||||
case AV_NETWORK: | ||||
ave_d=1.0; | ||||
break; | ||||
} | ||||
switch (ace) { | ||||
case AC_HIGH: | ||||
ace_d=0.35; | ||||
break; | ||||
case AC_MEDIUM: | ||||
ace_d=0.61; | ||||
break; | ||||
case AC_LOW: | ||||
ace_d=0.71; | ||||
break; | ||||
} | ||||
switch (aue) { | ||||
case AU_NONE: | ||||
aue_d=0.704; | ||||
break; | ||||
case AU_SINGLE_INSTANCE: | ||||
aue_d=0.56; | ||||
break; | ||||
case AU_MULTIPLE_INSTANCE: | ||||
aue_d=0.45; | ||||
break; | ||||
} | ||||
switch (cie) { | ||||
case CI_NONE: | ||||
cie_d=0; | ||||
break; | ||||
case CI_PARTIAL: | ||||
cie_d=0.275; | ||||
break; | ||||
case CI_COMPLETE: | ||||
cie_d=0.660; | ||||
break; | ||||
} | ||||
switch (iie) { | ||||
case II_NONE: | ||||
iie_d=0; | ||||
break; | ||||
case II_PARTIAL: | ||||
iie_d=0.275; | ||||
break; | ||||
case II_COMPLETE: | ||||
iie_d=0.660; | ||||
break; | ||||
} | ||||
switch (aie) { | ||||
case AI_NONE: | ||||
aie_d=0; | ||||
break; | ||||
case AI_PARTIAL: | ||||
aie_d=0.275; | ||||
break; | ||||
case AI_COMPLETE: | ||||
aie_d=0.660; | ||||
break; | ||||
} | ||||
switch (exe) { | ||||
case EX_UNPROVEN: | ||||
exe_d = 0.85; | ||||
break; | ||||
case EX_PROOF_OF_CONCEPT: | ||||
exe_d = 0.9; | ||||
break; | ||||
case EX_FUNCTIONAL: | ||||
exe_d = 0.95; | ||||
break; | ||||
case EX_HIGH: | ||||
exe_d = 1.0; | ||||
break; | ||||
case EX_NOT_DEFINED: | ||||
exe_d = 1.0; | ||||
break; | ||||
} | ||||
switch (rle) { | ||||
case RL_OFFICIAL_FIX: | ||||
rle_d = 0.87; | ||||
break; | ||||
case RL_TEMPORARY_FIX: | ||||
rle_d = 0.9; | ||||
break; | ||||
case RL_WORKAROUND: | ||||
rle_d = 0.95; | ||||
break; | ||||
case RL_UNAVAILABLE: | ||||
rle_d = 1.0; | ||||
break; | ||||
case RL_NOT_DEFINED: | ||||
rle_d = 1.0; | ||||
break; | ||||
} | ||||
switch (rce) { | ||||
case RC_UNCONFIRMED: | ||||
rce_d = 0.9; | ||||
break; | ||||
case RC_UNCORROBORATED: | ||||
rce_d = 0.95; | ||||
break; | ||||
case RC_CONFIRMED: | ||||
rce_d = 1.0; | ||||
break; | ||||
case RC_NOT_DEFINED: | ||||
rce_d = 1.0; | ||||
break; | ||||
} | ||||
exp_d = 20.00 * ave_d * ace_d * aue_d; | ||||
imp_d = 10.41 * (1.00 - (1.00 - cie_d * cre_d) * (1.00 - iie_d * ire_d | ||||
) * (1.00 - aie_d * are_d)); | ||||
imp_d = imp_d > 10.00 ? 10.00 : imp_d; | ||||
bas_d = ((0.6 * imp_d) + (0.4 * exp_d) - 1.5) * (fabs(imp_d) < EPS ? 0.00 | ||||
: 1.176); | ||||
bas_d = round(bas_d / 0.1) * 0.1; | ||||
adt_d = temp_score(exe, rle, rce, bas_d); | ||||
score = round(((adt_d + (10.00 - adt_d) * cde_d) * tde_d) / 0.1) * 0.1; | ||||
return score; | return 0; | |||
} | } | |||
End of changes. 5 change blocks. | ||||
621 lines changed or deleted | 21 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |