// DHCP enumeration void NmDhcpRefresh(HWND hWnd, SM_HUB *r) { LVB *b; RPC_ENUM_DHCP t; UINT i; // Validate arguments if (hWnd == NULL || r == NULL) { Close(hWnd); return; } Zero(&t, sizeof(t)); StrCpy(t.HubName, sizeof(t.HubName), r->HubName); if (CALL(hWnd, ScEnumDHCP(r->Rpc, &t)) == false) { return; } b = LvInsertStart(); for (i = 0;i < t.NumItem;i++) { RPC_ENUM_DHCP_ITEM *e = &t.Items[i]; wchar_t tmp0[MAX_SIZE]; wchar_t tmp1[MAX_SIZE]; wchar_t tmp2[MAX_SIZE]; wchar_t tmp3[MAX_SIZE]; wchar_t tmp4[MAX_SIZE]; wchar_t tmp5[MAX_SIZE]; char str[MAX_SIZE]; // ID UniToStru(tmp0, e->Id); // Time GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL); GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL); MacToStr(str, sizeof(str), e->MacAddress); StrToUni(tmp3, sizeof(tmp3), str); IPToStr32(str, sizeof(str), e->IpAddress); StrToUni(tmp4, sizeof(tmp4), str); StrToUni(tmp5, sizeof(tmp5), e->Hostname); LvInsertAdd(b, ICO_INTERNET, NULL, 6, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5); } LvInsertEnd(b, hWnd, L_TABLE); FreeRpcEnumDhcp(&t); }
// NAT enumeration void NmNatRefresh(HWND hWnd, SM_HUB *r) { LVB *b; RPC_ENUM_NAT t; UINT i; // Validate arguments if (hWnd == NULL || r == NULL) { return; } Zero(&t, sizeof(t)); StrCpy(t.HubName, sizeof(t.HubName), r->HubName); if (CALL(hWnd, ScEnumNAT(r->Rpc, &t)) == false) { Close(hWnd); return; } b = LvInsertStart(); for (i = 0;i < t.NumItem;i++) { RPC_ENUM_NAT_ITEM *e = &t.Items[i]; wchar_t tmp0[MAX_SIZE]; wchar_t *tmp1 = L""; wchar_t tmp2[MAX_SIZE]; wchar_t tmp3[MAX_SIZE]; wchar_t tmp4[MAX_SIZE]; wchar_t tmp5[MAX_SIZE]; wchar_t tmp6[MAX_SIZE]; wchar_t tmp7[MAX_SIZE]; wchar_t tmp8[MAX_SIZE]; wchar_t *tmp9 = L""; char v1[128], v2[128]; // ID UniToStru(tmp0, e->Id); // Protocol switch (e->Protocol) { case NAT_TCP: tmp1 = _UU("NM_NAT_PROTO_TCP"); break; case NAT_UDP: tmp1 = _UU("NM_NAT_PROTO_UDP"); break; case NAT_DNS: tmp1 = _UU("NM_NAT_PROTO_DNS"); break; case NAT_ICMP: tmp1 = _UU("NM_NAT_PROTO_ICMP"); break; } // Source host StrToUni(tmp2, sizeof(tmp2), e->SrcHost); // Source port UniToStru(tmp3, e->SrcPort); // Destination host StrToUni(tmp4, sizeof(tmp4), e->DestHost); // Destination port UniToStru(tmp5, e->DestPort); // Creation date and time of the session GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL); // Last communication date and time GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL); // Communication amount ToStr3(v1, sizeof(v1), e->RecvSize); ToStr3(v2, sizeof(v2), e->SendSize); UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2); // TCP state if (e->Protocol == NAT_TCP) { switch (e->TcpStatus) { case NAT_TCP_CONNECTING: tmp9 = _UU("NAT_TCP_CONNECTING"); break; case NAT_TCP_SEND_RESET: tmp9 = _UU("NAT_TCP_SEND_RESET"); break; case NAT_TCP_CONNECTED: tmp9 = _UU("NAT_TCP_CONNECTED"); break; case NAT_TCP_ESTABLISHED: tmp9 = _UU("NAT_TCP_ESTABLISHED"); break; case NAT_TCP_WAIT_DISCONNECT: tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT"); break; } } LvInsertAdd(b, ICO_PROTOCOL, NULL, 10, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9); } LvInsertEnd(b, hWnd, L_TABLE); FreeRpcEnumNat(&t); }
// Write the certificate object bool WriteSecCert(SECURE *sec, bool private_obj, char *name, X *x) { UINT obj_class = CKO_CERTIFICATE; CK_BBOOL b_true = true, b_false = false, b_private_obj = private_obj; UINT cert_type = CKC_X_509; CK_DATE start_date, end_date; UCHAR subject[MAX_SIZE]; UCHAR issuer[MAX_SIZE]; wchar_t w_subject[MAX_SIZE]; wchar_t w_issuer[MAX_SIZE]; UCHAR serial_number[MAX_SIZE]; UCHAR value[4096]; UINT ret; BUF *b; UINT object; CK_ATTRIBUTE a[] = { {CKA_SUBJECT, subject, 0}, // 0 {CKA_ISSUER, issuer, 0}, // 1 {CKA_SERIAL_NUMBER, serial_number, 0}, // 2 {CKA_VALUE, value, 0}, // 3 {CKA_CLASS, &obj_class, sizeof(obj_class)}, {CKA_TOKEN, &b_true, sizeof(b_true)}, {CKA_PRIVATE, &b_private_obj, sizeof(b_private_obj)}, {CKA_LABEL, name, StrLen(name)}, {CKA_CERTIFICATE_TYPE, &cert_type, sizeof(cert_type)}, #if 0 // Don't use these because some tokens fail {CKA_START_DATE, &start_date, sizeof(start_date)}, {CKA_END_DATE, &end_date, sizeof(end_date)}, #endif }; // Validate arguments if (sec == NULL) { return false; } if (name == NULL) { sec->Error = SEC_ERROR_BAD_PARAMETER; return false; } if (sec->SessionCreated == false) { sec->Error = SEC_ERROR_NO_SESSION; return false; } if (sec->LoginFlag == false && private_obj) { sec->Error = SEC_ERROR_NOT_LOGIN; return false; } // Copy the certificate to the buffer b = XToBuf(x, false); if (b == NULL) { sec->Error = SEC_ERROR_INVALID_CERT; return false; } if (b->Size > sizeof(value)) { // Size is too large FreeBuf(b); sec->Error = SEC_ERROR_DATA_TOO_BIG; return false; } Copy(value, b->Buf, b->Size); A_SIZE(a, 3) = b->Size; FreeBuf(b); // Store the Subject and the Issuer by encoding into UTF-8 GetPrintNameFromName(w_subject, sizeof(w_subject), x->subject_name); UniToUtf8(subject, sizeof(subject), w_subject); A_SIZE(a, 0) = StrLen(subject); if (x->root_cert == false) { GetPrintNameFromName(w_issuer, sizeof(w_issuer), x->issuer_name); UniToUtf8(issuer, sizeof(issuer), w_issuer); A_SIZE(a, 1) = StrLen(issuer); } // Copy the serial number Copy(serial_number, x->serial->data, MIN(x->serial->size, sizeof(serial_number))); A_SIZE(a, 2) = MIN(x->serial->size, sizeof(serial_number)); // Expiration date information UINT64ToCkDate(&start_date, SystemToLocal64(x->notBefore)); UINT64ToCkDate(&end_date, SystemToLocal64(x->notAfter)); // Workaround for Gemalto PKCS#11 API. It rejects a private certificate. if(sec->Dev->Id == 18 || sec->Dev->Id == 19) { b_private_obj = false; } // Remove objects which have the same name if (CheckSecObject(sec, name, SEC_X)) { DeleteSecCert(sec, name); } // Creating if ((ret = sec->Api->C_CreateObject(sec->SessionId, a, sizeof(a) / sizeof(a[0]), &object)) != CKR_OK) { // Failure sec->Error = SEC_ERROR_HARDWARE_ERROR; Debug("Error: 0x%02x\n", ret); return false; } // Clear Cache EraseEnumSecObjectCache(sec); return true; }