/* Initialize the extension data block. */ void ssl3_InitExtensionData(TLSExtensionData *xtnData, const sslSocket *ss) { unsigned int advertisedMax; PRCList *cursor; /* Set things up to the right starting state. */ PORT_Memset(xtnData, 0, sizeof(*xtnData)); xtnData->peerSupportsFfdheGroups = PR_FALSE; PR_INIT_CLIST(&xtnData->remoteKeyShares); /* Allocate enough to allow for native extensions, plus any custom ones. */ if (ss->sec.isServer) { advertisedMax = PR_MAX(PR_ARRAY_SIZE(certificateRequestHandlers), PR_ARRAY_SIZE(tls13_cert_req_senders)); } else { advertisedMax = PR_MAX(PR_ARRAY_SIZE(clientHelloHandlers), PR_ARRAY_SIZE(clientHelloSendersTLS)); ++advertisedMax; /* For the RI SCSV, which we also track. */ } for (cursor = PR_NEXT_LINK(&ss->extensionHooks); cursor != &ss->extensionHooks; cursor = PR_NEXT_LINK(cursor)) { ++advertisedMax; } xtnData->advertised = PORT_ZNewArray(PRUint16, advertisedMax); }
SECStatus parseGroupList(const char *arg, SSLNamedGroup **enabledGroups, unsigned int *enabledGroupsCount) { SSLNamedGroup *groups; char *str; char *p; unsigned int numValues = 0; unsigned int count = 0; /* Count the number of groups. */ str = PORT_Strdup(arg); if (!str) { return SECFailure; } p = strtok(str, ","); while (p) { ++numValues; p = strtok(NULL, ","); } PORT_Free(str); str = NULL; groups = PORT_ZNewArray(SSLNamedGroup, numValues); if (!groups) { goto done; } /* Get group names. */ str = PORT_Strdup(arg); if (!str) { goto done; } p = strtok(str, ","); while (p) { SSLNamedGroup group = groupNameToNamedGroup(p); if (group == ssl_grp_none) { count = 0; goto done; } groups[count++] = group; p = strtok(NULL, ","); } done: if (str) { PORT_Free(str); } if (!count) { PORT_Free(groups); return SECFailure; } *enabledGroupsCount = count; *enabledGroups = groups; return SECSuccess; }
SECItemArray * SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len) { SECItemArray *result = NULL; void *mark = NULL; if (array != NULL && array->items != NULL) { PORT_Assert(0); PORT_SetError(SEC_ERROR_INVALID_ARGS); return NULL; } if (arena != NULL) { mark = PORT_ArenaMark(arena); } if (array == NULL) { if (arena != NULL) { result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray)); } else { result = PORT_ZAlloc(sizeof(SECItemArray)); } if (result == NULL) { goto loser; } } else { result = array; } result->len = len; if (len) { if (arena != NULL) { result->items = PORT_ArenaZNewArray(arena, SECItem, len); } else { result->items = PORT_ZNewArray(SECItem, len); } if (result->items == NULL) { goto loser; } } else { result->items = NULL; } if (mark) { PORT_ArenaUnmark(arena, mark); } return result; loser: if ( arena != NULL ) { if (mark) { PORT_ArenaRelease(arena, mark); } } else { if (result != NULL && array == NULL) { PORT_Free(result); } } if (array != NULL) { array->items = NULL; array->len = 0; } return NULL; }
SECItemArray * SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len) { SECItemArray *result = NULL; void *mark = NULL; if (arena != NULL) { mark = PORT_ArenaMark(arena); } if (array == NULL) { if (arena != NULL) { result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray)); } else { result = PORT_ZAlloc(sizeof(SECItemArray)); } if (result == NULL) { goto loser; } } else { PORT_Assert(array->items == NULL); result = array; } result->len = len; if (len) { if (arena != NULL) { result->items = PORT_ArenaZNewArray(arena, SECItem, len); } else { result->items = PORT_ZNewArray(SECItem, len); } if (result->items == NULL) { goto loser; } } else { result->items = NULL; } if (mark) { PORT_ArenaUnmark(arena, mark); } return(result); loser: if ( arena != NULL ) { if (mark) { PORT_ArenaRelease(arena, mark); } if (array != NULL) { array->items = NULL; array->len = 0; } } else { if (result != NULL && array == NULL) { PORT_Free(result); } /* * If array is not NULL, the above has set array->data and * array->len to 0. */ } return(NULL); }