mirror of
https://github.com/pocoproject/poco.git
synced 2025-03-03 04:38:39 +01:00
Merge branch 'poco-1.10.0' into devel
This commit is contained in:
commit
303ddeec9e
@ -40,7 +40,6 @@
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
X509Certificate::X509Certificate(std::istream& istr):
|
||||
_pCert(0)
|
||||
{
|
||||
@ -223,13 +222,22 @@ void X509Certificate::save(const std::string& path) const
|
||||
}
|
||||
|
||||
|
||||
std::string _X509_NAME_oneline_utf8(X509_NAME *name)
|
||||
{
|
||||
BIO * bio_out = BIO_new(BIO_s_mem());
|
||||
X509_NAME_print_ex(bio_out, name, 0, (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) & ~ASN1_STRFLGS_ESC_MSB);
|
||||
BUF_MEM *bio_buf;
|
||||
BIO_get_mem_ptr(bio_out, &bio_buf);
|
||||
std::string line = std::string(bio_buf->data, bio_buf->length);
|
||||
BIO_free(bio_out);
|
||||
return line;
|
||||
}
|
||||
|
||||
|
||||
void X509Certificate::init()
|
||||
{
|
||||
char buffer[NAME_BUFFER_SIZE];
|
||||
X509_NAME_oneline(X509_get_issuer_name(_pCert), buffer, sizeof(buffer));
|
||||
_issuerName = buffer;
|
||||
X509_NAME_oneline(X509_get_subject_name(_pCert), buffer, sizeof(buffer));
|
||||
_subjectName = buffer;
|
||||
_issuerName = _X509_NAME_oneline_utf8(X509_get_issuer_name(_pCert));
|
||||
_subjectName = _X509_NAME_oneline_utf8(X509_get_subject_name(_pCert));
|
||||
BIGNUM* pBN = ASN1_INTEGER_to_BN(X509_get_serialNumber(const_cast<X509*>(_pCert)), 0);
|
||||
if (pBN)
|
||||
{
|
||||
|
@ -54,6 +54,27 @@ static const std::string APPINF_PEM(
|
||||
"-----END CERTIFICATE-----\n"
|
||||
);
|
||||
|
||||
static const std::string UTF8_PEM(
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
"MIIDEzCCArigAwIBAgIQAKegojl/YLNUPqTyCnQ4LzAKBggqhkjOPQQDAjB0MQsw\n"
|
||||
"CQYDVQQGEwJDSDEQMA4GA1UECgwHU2llbWVuczEUMBIGA1UECwwLQlQgRGl2aXNp\n"
|
||||
"b24xPTA7BgNVBAMMNEt1cnpSUzFNUDIyc3ByaW50NTlwcmVWVlMgcHJvamVjdCBp\n"
|
||||
"bnRlcm1lZGlhdGUgQ0EgRUMwHhcNMTkxMTI3MDAwMDAwWhcNMjQxMTI4MTkzMzQw\n"
|
||||
"WjCCAQMxJDAiBgNVBAUTG1BJRDpQWEM1LkUwMDMgU046MTQwMDA0RDhFMjELMAkG\n"
|
||||
"A1UEBhMCQ0gxEDAOBgNVBAoMB1NpZW1lbnMxFzAVBgNVBAsMDlNJIEJQIERpdmlz\n"
|
||||
"aW9uMQwwCgYDVQQIDANadWcxHjAcBgNVBAcMFVrDpGhsZXJ3ZWcgNyBSb29tIDU0\n"
|
||||
"NDEnMCUGCSqGSIb3DQEJARYYcmljaGFyZC5rdXJ6QHNpZW1lbnMuY29tMRgwFgYD\n"
|
||||
"VQQLDA9TU0wgQ2VydGlmaWNhdGUxMjAwBgNVBAMMKUt1cnpSUzFNUDIyc3ByaW50\n"
|
||||
"NTlwcmVWVlMuS3VyUFhDNUJOUjM3NjUyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\n"
|
||||
"QgAEJjy+wx/mN9FbW3/IoOAOXdbfQvF1gF8wNasHUeLdn1UsCABnaAZTytqX7gMD\n"
|
||||
"Y5HS32SIvdULYwsy6Dn3CO5tVKOBmjCBlzAOBgNVHQ8BAf8EBAMCA6gwIAYDVR0l\n"
|
||||
"AQH/BBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0O\n"
|
||||
"BBYEFIbtuXQJoVh7FlYiWZeWT2ooEQRNMB8GA1UdIwQYMBaAFOtUSuT1OYK7bNS4\n"
|
||||
"Mqz0UGPoGavuMBUGA1UdEQQOMAyHBAqqt7SHBMCo/AEwCgYIKoZIzj0EAwIDSQAw\n"
|
||||
"RgIhANBQnB1HFLHp7t8oZbLYsm8nWI0hshmVQupXV9oFwb4qAiEAg5UqSDnvAax3\n"
|
||||
"LWWgnAZJkUS0AEQXu4Rx9ZiP7wBdFtA=\n"
|
||||
"-----END CERTIFICATE-----\n"
|
||||
);
|
||||
|
||||
CryptoTest::CryptoTest(const std::string& name): CppUnit::TestCase(name)
|
||||
{
|
||||
@ -99,7 +120,7 @@ void CryptoTest::testEncryptDecryptWithSalt()
|
||||
{
|
||||
Cipher::Ptr pCipher = CipherFactory::defaultFactory().createCipher(CipherKey("aes256", "simplepwd", "Too much salt"));
|
||||
Cipher::Ptr pCipher2 = CipherFactory::defaultFactory().createCipher(CipherKey("aes256", "simplepwd", "Too much salt"));
|
||||
|
||||
|
||||
for (std::size_t n = 1; n < MAX_DATA_SIZE; n++)
|
||||
{
|
||||
std::string in(n, 'x');
|
||||
@ -192,7 +213,7 @@ void CryptoTest::testEncryptDecryptDESECB()
|
||||
void CryptoTest::testEncryptDecryptGCM()
|
||||
{
|
||||
CipherKey key("aes-256-gcm");
|
||||
|
||||
|
||||
CipherKey::ByteVec iv(20, 213);
|
||||
key.setIV(iv);
|
||||
|
||||
@ -224,7 +245,7 @@ void CryptoTest::testEncryptDecryptGCM()
|
||||
void CryptoTest::testPassword()
|
||||
{
|
||||
CipherKey key("aes256", "password", "salt");
|
||||
|
||||
|
||||
std::ostringstream keyStream;
|
||||
Poco::Base64Encoder base64KeyEnc(keyStream);
|
||||
base64KeyEnc.write(reinterpret_cast<const char*>(&key.getKey()[0]), key.keySize());
|
||||
@ -293,7 +314,7 @@ void CryptoTest::testStreams()
|
||||
EncryptingOutputStream encryptor(sstr, *pCipher);
|
||||
encryptor << SECRET_MESSAGE;
|
||||
encryptor.close();
|
||||
|
||||
|
||||
DecryptingInputStream decryptor(sstr, *pCipher);
|
||||
std::string result;
|
||||
Poco::StreamCopier::copyToString(decryptor, result);
|
||||
@ -317,7 +338,7 @@ void CryptoTest::testCertificate()
|
||||
{
|
||||
std::istringstream certStream(APPINF_PEM);
|
||||
X509Certificate cert(certStream);
|
||||
|
||||
|
||||
std::string subjectName(cert.subjectName());
|
||||
std::string issuerName(cert.issuerName());
|
||||
std::string commonName(cert.commonName());
|
||||
@ -326,8 +347,8 @@ void CryptoTest::testCertificate()
|
||||
std::string stateOrProvince(cert.subjectName(X509Certificate::NID_STATE_OR_PROVINCE));
|
||||
std::string organizationName(cert.subjectName(X509Certificate::NID_ORGANIZATION_NAME));
|
||||
std::string organizationUnitName(cert.subjectName(X509Certificate::NID_ORGANIZATION_UNIT_NAME));
|
||||
|
||||
assertTrue (subjectName == "/CN=appinf.com/O=Applied Informatics Software Engineering GmbH/OU=Development/ST=Carinthia/C=AT/L=St. Jakob im Rosental/emailAddress=guenter.obiltschnig@appinf.com");
|
||||
|
||||
assertTrue (subjectName == "CN=appinf.com,O=Applied Informatics Software Engineering GmbH,OU=Development,ST=Carinthia,C=AT,L=St. Jakob im Rosental,emailAddress=guenter.obiltschnig@appinf.com");
|
||||
assertTrue (issuerName == subjectName);
|
||||
assertTrue (commonName == "appinf.com");
|
||||
assertTrue (country == "AT");
|
||||
@ -335,13 +356,41 @@ void CryptoTest::testCertificate()
|
||||
assertTrue (stateOrProvince == "Carinthia");
|
||||
assertTrue (organizationName == "Applied Informatics Software Engineering GmbH");
|
||||
assertTrue (organizationUnitName == "Development");
|
||||
|
||||
|
||||
// fails with recent OpenSSL versions:
|
||||
// assertTrue (cert.issuedBy(cert));
|
||||
|
||||
// assert (cert.issuedBy(cert));
|
||||
|
||||
std::istringstream otherCertStream(APPINF_PEM);
|
||||
X509Certificate otherCert(otherCertStream);
|
||||
|
||||
|
||||
assertTrue (cert.equals(otherCert));
|
||||
}
|
||||
|
||||
void CryptoTest::testCertificateUTF8()
|
||||
{
|
||||
std::istringstream certStream(UTF8_PEM);
|
||||
X509Certificate cert(certStream);
|
||||
|
||||
std::string subjectName(cert.subjectName());
|
||||
std::string issuerName(cert.issuerName());
|
||||
std::string commonName(cert.commonName());
|
||||
std::string country(cert.subjectName(X509Certificate::NID_COUNTRY));
|
||||
std::string localityName(cert.subjectName(X509Certificate::NID_LOCALITY_NAME));
|
||||
std::string stateOrProvince(cert.subjectName(X509Certificate::NID_STATE_OR_PROVINCE));
|
||||
std::string organizationName(cert.subjectName(X509Certificate::NID_ORGANIZATION_NAME));
|
||||
std::string organizationUnitName(cert.subjectName(X509Certificate::NID_ORGANIZATION_UNIT_NAME));
|
||||
|
||||
assertTrue (subjectName == "serialNumber=PID:PXC5.E003 SN:140004D8E2,C=CH,O=Siemens,OU=SI BP Division,ST=Zug,L=Zählerweg 7 Room 544,emailAddress=richard.kurz@siemens.com,OU=SSL Certificate,CN=KurzRS1MP22sprint59preVVS.KurPXC5BNR37652");
|
||||
assertTrue (commonName == "KurzRS1MP22sprint59preVVS.KurPXC5BNR37652");
|
||||
assertTrue (country == "CH");
|
||||
assertTrue (localityName == "Zählerweg 7 Room 544");
|
||||
assertTrue (stateOrProvince == "Zug");
|
||||
assertTrue (organizationName == "Siemens");
|
||||
assertTrue (organizationUnitName == "SI BP Division");
|
||||
|
||||
std::istringstream otherCertStream(UTF8_PEM);
|
||||
X509Certificate otherCert(otherCertStream);
|
||||
|
||||
assertTrue (cert.equals(otherCert));
|
||||
}
|
||||
|
||||
@ -371,6 +420,7 @@ CppUnit::Test* CryptoTest::suite()
|
||||
CppUnit_addTest(pSuite, CryptoTest, testDecryptInterop);
|
||||
CppUnit_addTest(pSuite, CryptoTest, testStreams);
|
||||
CppUnit_addTest(pSuite, CryptoTest, testCertificate);
|
||||
CppUnit_addTest(pSuite, CryptoTest, testCertificateUTF8);
|
||||
|
||||
return pSuite;
|
||||
}
|
||||
|
@ -21,11 +21,11 @@
|
||||
class CryptoTest: public CppUnit::TestCase
|
||||
{
|
||||
public:
|
||||
enum
|
||||
enum
|
||||
{
|
||||
MAX_DATA_SIZE = 10000
|
||||
};
|
||||
|
||||
|
||||
CryptoTest(const std::string& name);
|
||||
~CryptoTest();
|
||||
|
||||
@ -40,7 +40,8 @@ public:
|
||||
void testEncryptInterop();
|
||||
void testDecryptInterop();
|
||||
void testCertificate();
|
||||
|
||||
void testCertificateUTF8();
|
||||
|
||||
void setUp();
|
||||
void tearDown();
|
||||
|
||||
|
@ -106,8 +106,8 @@ void PKCS12ContainerTest::fullCert(const X509Certificate& x509)
|
||||
std::string emailAddress(x509.subjectName(X509Certificate::NID_PKCS9_EMAIL_ADDRESS));
|
||||
std::string serialNumber(x509.serialNumber());
|
||||
|
||||
assertTrue (subjectName == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Server");
|
||||
assertTrue (issuerName == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Intermediate CA v3");
|
||||
assertTrue (subjectName == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Server");
|
||||
assertTrue (issuerName == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Intermediate CA v3");
|
||||
assertTrue (commonName == "CV Server");
|
||||
assertTrue (country == "CH");
|
||||
assertTrue (localityName.empty());
|
||||
@ -134,8 +134,8 @@ void PKCS12ContainerTest::fullList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caNamesList[certOrder[1]].empty());
|
||||
}
|
||||
|
||||
assertTrue (caList[certOrder[0]].subjectName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[0]].issuerName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[0]].subjectName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[0]].issuerName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[0]].commonName() == "CV Root CA v3");
|
||||
assertTrue (caList[certOrder[0]].subjectName(X509Certificate::NID_COUNTRY) == "CH");
|
||||
assertTrue (caList[certOrder[0]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -147,8 +147,8 @@ void PKCS12ContainerTest::fullList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caList[certOrder[0]].version() == 3);
|
||||
assertTrue (caList[certOrder[0]].signatureAlgorithm() == "sha256WithRSAEncryption");
|
||||
|
||||
assertTrue (caList[certOrder[1]].subjectName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[1]].issuerName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[1]].subjectName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[1]].issuerName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[1]].commonName() == "CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[1]].subjectName(X509Certificate::NID_COUNTRY) == "CH");
|
||||
assertTrue (caList[certOrder[1]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -207,8 +207,8 @@ void PKCS12ContainerTest::certsOnlyList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caNamesList[certOrder[4]] == "vally-ca");
|
||||
}
|
||||
|
||||
assertTrue (caList[certOrder[0]].subjectName() == "/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[0]].issuerName() == "/C=US/O=Internet Security Research Group/CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[0]].subjectName() == "C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[0]].issuerName() == "C=US,O=Internet Security Research Group,CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[0]].commonName() == "Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[0]].subjectName(X509Certificate::NID_COUNTRY) == "US");
|
||||
assertTrue (caList[certOrder[0]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -220,8 +220,8 @@ void PKCS12ContainerTest::certsOnlyList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caList[certOrder[0]].version() == 3);
|
||||
assertTrue (caList[certOrder[0]].signatureAlgorithm() == "sha256WithRSAEncryption");
|
||||
|
||||
assertTrue (caList[certOrder[1]].subjectName() == "/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[1]].issuerName() == "/O=Digital Signature Trust Co./CN=DST Root CA X3");
|
||||
assertTrue (caList[certOrder[1]].subjectName() == "C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[1]].issuerName() == "O=Digital Signature Trust Co.,CN=DST Root CA X3");
|
||||
assertTrue (caList[certOrder[1]].commonName() == "Let's Encrypt Authority X3");
|
||||
assertTrue (caList[certOrder[1]].subjectName(X509Certificate::NID_COUNTRY) == "US");
|
||||
assertTrue (caList[certOrder[1]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -233,8 +233,8 @@ void PKCS12ContainerTest::certsOnlyList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caList[certOrder[1]].version() == 3);
|
||||
assertTrue (caList[certOrder[1]].signatureAlgorithm() == "sha256WithRSAEncryption");
|
||||
|
||||
assertTrue (caList[certOrder[2]].subjectName() == "/C=US/O=Internet Security Research Group/CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[2]].issuerName() == "/C=US/O=Internet Security Research Group/CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[2]].subjectName() == "C=US,O=Internet Security Research Group,CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[2]].issuerName() == "C=US,O=Internet Security Research Group,CN=ISRG Root X1");
|
||||
assertTrue (caList[certOrder[2]].commonName() == "ISRG Root X1");
|
||||
assertTrue (caList[certOrder[2]].subjectName(X509Certificate::NID_COUNTRY) == "US");
|
||||
assertTrue (caList[certOrder[2]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -246,8 +246,8 @@ void PKCS12ContainerTest::certsOnlyList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caList[certOrder[2]].version() == 3);
|
||||
assertTrue (caList[certOrder[2]].signatureAlgorithm() == "sha256WithRSAEncryption");
|
||||
|
||||
assertTrue (caList[certOrder[3]].subjectName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[3]].issuerName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[3]].subjectName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[3]].issuerName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[3]].commonName() == "CV Root CA v3");
|
||||
assertTrue (caList[certOrder[3]].subjectName(X509Certificate::NID_COUNTRY) == "CH");
|
||||
assertTrue (caList[certOrder[3]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
@ -259,8 +259,8 @@ void PKCS12ContainerTest::certsOnlyList(const PKCS12Container::CAList& caList,
|
||||
assertTrue (caList[certOrder[3]].version() == 3);
|
||||
assertTrue (caList[certOrder[3]].signatureAlgorithm() == "sha256WithRSAEncryption");
|
||||
|
||||
assertTrue (caList[certOrder[4]].subjectName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[4]].issuerName() == "/C=CH/ST=Zug/O=Crypto Vally/CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[4]].subjectName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[4]].issuerName() == "C=CH,ST=Zug,O=Crypto Vally,CN=CV Root CA v3");
|
||||
assertTrue (caList[certOrder[4]].commonName() == "CV Intermediate CA v3");
|
||||
assertTrue (caList[certOrder[4]].subjectName(X509Certificate::NID_COUNTRY) == "CH");
|
||||
assertTrue (caList[certOrder[4]].subjectName(X509Certificate::NID_LOCALITY_NAME).empty());
|
||||
|
@ -103,9 +103,11 @@ S& trimInPlace(S& str)
|
||||
while (first <= last && Ascii::isSpace(str[first])) ++first;
|
||||
while (last >= first && Ascii::isSpace(str[last])) --last;
|
||||
|
||||
str.resize(last + 1);
|
||||
str.erase(0, first);
|
||||
|
||||
if (last >= 0)
|
||||
{
|
||||
str.resize(last + 1);
|
||||
str.erase(0, first);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
@ -364,13 +364,13 @@ void FileChannelTest::purgeAge(const std::string& pa)
|
||||
assertTrue (f1.exists());
|
||||
File f2(name + ".2");
|
||||
assertTrue (f2.exists());
|
||||
|
||||
|
||||
Thread::sleep(5000);
|
||||
for (int i = 0; i < 50; ++i)
|
||||
{
|
||||
pChannel->log(msg);
|
||||
}
|
||||
|
||||
|
||||
assertTrue (!f2.exists());
|
||||
}
|
||||
catch (...)
|
||||
@ -636,15 +636,15 @@ CppUnit::Test* FileChannelTest::suite()
|
||||
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateBySize);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateByAge);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeDayUTC);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeDayLocal);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeHourUTC);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeHourLocal);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeMinUTC);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testRotateAtTimeMinLocal);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeDayUTC);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeDayLocal);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeHourUTC);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeHourLocal);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeMinUTC);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeMinLocal);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testArchive);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testCompress);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testPurgeAge);
|
||||
CppUnit_addLongTest(pSuite, FileChannelTest, testPurgeAge);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testPurgeCount);
|
||||
CppUnit_addTest(pSuite, FileChannelTest, testWrongPurgeOption);
|
||||
|
||||
|
6
Makefile
6
Makefile
@ -115,10 +115,10 @@ endif
|
||||
find $(INSTALLDIR)/lib -name "libPoco*" -type f -exec rm -f {} \;
|
||||
find $(INSTALLDIR)/lib -name "libPoco*" -type l -exec rm -f {} \;
|
||||
|
||||
libexecs = Foundation-libexec Encodings-libexec XML-libexec JSON-libexec Util-libexec Net-libexec Crypto-libexec NetSSL_OpenSSL-libexec Data-libexec Data/SQLite-libexec Data/ODBC-libexec Data/MySQL-libexec Zip-libexec PageCompiler-libexec PageCompiler/File2Page-libexec CppParser-libexec PDF-libexec MongoDB-libexec Redis-libexec
|
||||
tests = Foundation-tests Encodings-tests XML-tests JSON-tests Util-tests Net-tests Crypto-tests NetSSL_OpenSSL-tests Data-tests Data/SQLite-tests Data/ODBC-tests Data/MySQL-tests Zip-tests CppParser-tests PDF-tests MongoDB-tests Redis-tests
|
||||
libexecs = Foundation-libexec Encodings-libexec XML-libexec JSON-libexec Util-libexec Net-libexec Crypto-libexec NetSSL_OpenSSL-libexec Data-libexec Data/SQLite-libexec Data/ODBC-libexec Data/MySQL-libexec Zip-libexec JWT-libexec PageCompiler-libexec PageCompiler/File2Page-libexec CppParser-libexec PDF-libexec MongoDB-libexec Redis-libexec
|
||||
tests = Foundation-tests Encodings-tests XML-tests JSON-tests Util-tests Net-tests Crypto-tests NetSSL_OpenSSL-tests Data-tests Data/SQLite-tests Data/ODBC-tests Data/MySQL-tests JWT-tests Zip-tests CppParser-tests PDF-tests MongoDB-tests Redis-tests
|
||||
samples = Foundation-samples Encodings-samples XML-samples JSON-samples Util-samples Net-samples Crypto-samples NetSSL_OpenSSL-samples Data-samples MongoDB-samples Zip-samples PageCompiler-samples PDF-samples
|
||||
cleans = Foundation-clean Encodings-clean XML-clean JSON-clean Util-clean Net-clean Crypto-clean NetSSL_OpenSSL-clean Data-clean Data/SQLite-clean Data/ODBC-clean Data/MySQL-clean Zip-clean PageCompiler-clean PageCompiler/File2Page-clean CppParser-clean PDF-clean MongoDB-clean Redis-clean
|
||||
cleans = Foundation-clean Encodings-clean XML-clean JSON-clean Util-clean Net-clean Crypto-clean NetSSL_OpenSSL-clean Data-clean Data/SQLite-clean Data/ODBC-clean Data/MySQL-clean JWT-clean Zip-clean PageCompiler-clean PageCompiler/File2Page-clean CppParser-clean PDF-clean MongoDB-clean Redis-clean
|
||||
|
||||
.PHONY: $(libexecs)
|
||||
.PHONY: $(tests)
|
||||
|
@ -1388,9 +1388,9 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
|
||||
if (getifaddrs(&ifaces) < 0)
|
||||
throw NetException("cannot get network adapter list");
|
||||
|
||||
try
|
||||
for (currIface = ifaces; currIface != 0; currIface = currIface->ifa_next)
|
||||
{
|
||||
for (currIface = ifaces; currIface != 0; currIface = currIface->ifa_next)
|
||||
try
|
||||
{
|
||||
if (!currIface->ifa_addr) continue;
|
||||
|
||||
@ -1462,9 +1462,14 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
catch (Poco::Exception&)
|
||||
{
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
if (ifaces) freeifaddrs(ifaces);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
if (ifaces) freeifaddrs(ifaces);
|
||||
|
||||
@ -1601,9 +1606,9 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
|
||||
if (getifaddrs(&ifaces) < 0)
|
||||
throw NetException("cannot get network adapter list");
|
||||
|
||||
try
|
||||
for (iface = ifaces; iface; iface = iface->ifa_next)
|
||||
{
|
||||
for (iface = ifaces; iface; iface = iface->ifa_next)
|
||||
try
|
||||
{
|
||||
if (!iface->ifa_addr) continue;
|
||||
|
||||
@ -1678,13 +1683,16 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
|
||||
ifIt->second.addAddress(address, subnetMask, broadcastAddress);
|
||||
}
|
||||
}
|
||||
} // for interface
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
if (ifaces) freeifaddrs(ifaces);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
catch (Poco::Exception&)
|
||||
{
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
if (ifaces) freeifaddrs(ifaces);
|
||||
throw;
|
||||
}
|
||||
} // for interface
|
||||
|
||||
if (ifaces) freeifaddrs(ifaces);
|
||||
|
||||
|
@ -245,7 +245,7 @@ void SecureSocketImpl::close()
|
||||
serverDisconnect(&_hCreds, &_hContext);
|
||||
else
|
||||
clientDisconnect(&_hCreds, &_hContext);
|
||||
|
||||
|
||||
_pSocket->close();
|
||||
cleanup();
|
||||
}
|
||||
@ -276,7 +276,7 @@ void SecureSocketImpl::verifyPeerCertificate()
|
||||
{
|
||||
if (_peerHostName.empty())
|
||||
_peerHostName = _pSocket->peerAddress().host().toString();
|
||||
|
||||
|
||||
verifyPeerCertificate(_peerHostName);
|
||||
}
|
||||
|
||||
@ -362,7 +362,7 @@ int SecureSocketImpl::sendBytes(const void* buffer, int length, int flags)
|
||||
SecBuffer* pExtraBuffer = 0;
|
||||
|
||||
std::memcpy(_sendBuffer.begin() + _streamSizes.cbHeader, pBuffer + dataSent, dataSize);
|
||||
|
||||
|
||||
msg.setSecBufferStreamHeader(0, _sendBuffer.begin(), _streamSizes.cbHeader);
|
||||
msg.setSecBufferData(1, _sendBuffer.begin() + _streamSizes.cbHeader, dataSize);
|
||||
msg.setSecBufferStreamTrailer(2, _sendBuffer.begin() + _streamSizes.cbHeader + dataSize, _streamSizes.cbTrailer);
|
||||
@ -378,7 +378,7 @@ int SecureSocketImpl::sendBytes(const void* buffer, int length, int flags)
|
||||
int sent = sendRawBytes(_sendBuffer.begin(), outBufferLen, flags);
|
||||
if (_pSocket->getBlocking() && sent == -1)
|
||||
{
|
||||
if (dataSent == 0)
|
||||
if (dataSent == 0)
|
||||
return -1;
|
||||
else
|
||||
return dataSent;
|
||||
@ -452,10 +452,10 @@ int SecureSocketImpl::receiveBytes(void* buffer, int length, int flags)
|
||||
if (needData)
|
||||
{
|
||||
int numBytes = receiveRawBytes(_recvBuffer.begin() + _recvBufferOffset, _ioBufferSize - _recvBufferOffset);
|
||||
|
||||
|
||||
if (numBytes == -1)
|
||||
return -1;
|
||||
else if (numBytes == 0)
|
||||
else if (numBytes == 0)
|
||||
break;
|
||||
else
|
||||
_recvBufferOffset += numBytes;
|
||||
@ -484,7 +484,7 @@ int SecureSocketImpl::receiveBytes(void* buffer, int length, int flags)
|
||||
{
|
||||
// bytesDecoded contains everything including overflow data
|
||||
rc = bytesDecoded;
|
||||
if (rc > length)
|
||||
if (rc > length)
|
||||
rc = length;
|
||||
return rc;
|
||||
}
|
||||
@ -604,7 +604,7 @@ SECURITY_STATUS SecureSocketImpl::decodeBufferFull(BYTE* pBuffer, DWORD bufSize,
|
||||
overflowBuffer.resize(bufSize);
|
||||
if (outLength > 0)
|
||||
{
|
||||
// make pOutBuffer full
|
||||
// make pOutBuffer full
|
||||
std::memcpy(pOutBuffer, pDataBuffer->pvBuffer, outLength);
|
||||
// no longer valid to write to pOutBuffer
|
||||
pOutBuffer = 0;
|
||||
@ -643,7 +643,7 @@ SECURITY_STATUS SecureSocketImpl::decodeBufferFull(BYTE* pBuffer, DWORD bufSize,
|
||||
}
|
||||
}
|
||||
|
||||
if (securityStatus == SEC_I_RENEGOTIATE)
|
||||
if (securityStatus == SEC_I_RENEGOTIATE)
|
||||
{
|
||||
_needData = false;
|
||||
securityStatus = performClientHandshakeLoop();
|
||||
@ -652,7 +652,7 @@ SECURITY_STATUS SecureSocketImpl::decodeBufferFull(BYTE* pBuffer, DWORD bufSize,
|
||||
}
|
||||
}
|
||||
while (securityStatus == SEC_E_OK && pBuffer);
|
||||
|
||||
|
||||
if (overflowOffset > 0)
|
||||
{
|
||||
_overflowBuffer.resize(overflowOffset);
|
||||
@ -733,7 +733,7 @@ void SecureSocketImpl::clientConnectVerify()
|
||||
try
|
||||
{
|
||||
SECURITY_STATUS securityStatus = _securityFunctions.QueryContextAttributesW(&_hContext, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (PVOID) &_pPeerCertificate);
|
||||
if (securityStatus != SEC_E_OK)
|
||||
if (securityStatus != SEC_E_OK)
|
||||
throw SSLException("Failed to obtain peer certificate", Utility::formatError(securityStatus));
|
||||
|
||||
clientVerifyCertificate(_peerHostName);
|
||||
@ -791,7 +791,7 @@ void SecureSocketImpl::performInitialClientHandshake()
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
&_hContext,
|
||||
&_hContext,
|
||||
&_outSecBuffer,
|
||||
&contextAttributes,
|
||||
&ts);
|
||||
@ -808,21 +808,21 @@ void SecureSocketImpl::performInitialClientHandshake()
|
||||
throw SSLException("Handshake failed", Utility::formatError(_securityStatus));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// incomplete credentials: more calls to InitializeSecurityContext needed
|
||||
// send the token
|
||||
sendInitialTokenOutBuffer();
|
||||
|
||||
if (_securityStatus == SEC_E_OK)
|
||||
{
|
||||
// The security context was successfully initialized.
|
||||
// There is no need for another InitializeSecurityContext (Schannel) call.
|
||||
// The security context was successfully initialized.
|
||||
// There is no need for another InitializeSecurityContext (Schannel) call.
|
||||
_state = ST_DONE;
|
||||
return;
|
||||
}
|
||||
|
||||
//SEC_I_CONTINUE_NEEDED was returned:
|
||||
// Wait for a return token. The returned token is then passed in
|
||||
// Wait for a return token. The returned token is then passed in
|
||||
// another call to InitializeSecurityContext (Schannel). The output token can be empty.
|
||||
|
||||
_extraSecBuffer.pvBuffer = 0;
|
||||
@ -853,7 +853,7 @@ SECURITY_STATUS SecureSocketImpl::performClientHandshakeLoop()
|
||||
while (_securityStatus == SEC_I_CONTINUE_NEEDED || _securityStatus == SEC_E_INCOMPLETE_MESSAGE || _securityStatus == SEC_I_INCOMPLETE_CREDENTIALS)
|
||||
{
|
||||
performClientHandshakeLoopCondReceive();
|
||||
|
||||
|
||||
if (_securityStatus == SEC_E_OK)
|
||||
{
|
||||
performClientHandshakeLoopOK();
|
||||
@ -912,7 +912,7 @@ void SecureSocketImpl::performClientHandshakeLoopError()
|
||||
|
||||
void SecureSocketImpl::performClientHandshakeSendOutBuffer()
|
||||
{
|
||||
if (_outSecBuffer[0].cbBuffer && _outSecBuffer[0].pvBuffer)
|
||||
if (_outSecBuffer[0].cbBuffer && _outSecBuffer[0].pvBuffer)
|
||||
{
|
||||
int numBytes = sendRawBytes(static_cast<const void*>(_outSecBuffer[0].pvBuffer), _outSecBuffer[0].cbBuffer);
|
||||
if (numBytes != _outSecBuffer[0].cbBuffer)
|
||||
@ -966,14 +966,16 @@ void SecureSocketImpl::performClientHandshakeLoopReceive()
|
||||
void SecureSocketImpl::performClientHandshakeLoopCondReceive()
|
||||
{
|
||||
poco_assert_dbg (_securityStatus == SEC_E_INCOMPLETE_MESSAGE || SEC_I_CONTINUE_NEEDED);
|
||||
|
||||
|
||||
performClientHandshakeLoopInit();
|
||||
if (_needData)
|
||||
{
|
||||
if (_recvBuffer.capacity() != IO_BUFFER_SIZE)
|
||||
_recvBuffer.setCapacity(IO_BUFFER_SIZE);
|
||||
performClientHandshakeLoopReceive();
|
||||
}
|
||||
else _needData = true;
|
||||
|
||||
|
||||
_inSecBuffer.setSecBufferToken(0, _recvBuffer.begin(), _recvBufferOffset);
|
||||
// inbuffer 1 should be empty
|
||||
_inSecBuffer.setSecBufferEmpty(1);
|
||||
@ -1046,7 +1048,7 @@ void SecureSocketImpl::performServerHandshake()
|
||||
serverHandshakeLoop(&_hContext, &_hCreds, _clientAuthRequired, true, true);
|
||||
|
||||
SECURITY_STATUS securityStatus;
|
||||
if (_clientAuthRequired)
|
||||
if (_clientAuthRequired)
|
||||
{
|
||||
poco_assert_dbg (!_pPeerCertificate);
|
||||
securityStatus = _securityFunctions.QueryContextAttributesW(&_hContext, SECPKG_ATTR_REMOTE_CERT_CONTEXT, &_pPeerCertificate);
|
||||
@ -1084,7 +1086,7 @@ bool SecureSocketImpl::serverHandshakeLoop(PCtxtHandle phContext, PCredHandle ph
|
||||
|
||||
while (securityStatus == SEC_I_CONTINUE_NEEDED || securityStatus == SEC_E_INCOMPLETE_MESSAGE || securityStatus == SEC_I_INCOMPLETE_CREDENTIALS)
|
||||
{
|
||||
if (securityStatus == SEC_E_INCOMPLETE_MESSAGE)
|
||||
if (securityStatus == SEC_E_INCOMPLETE_MESSAGE)
|
||||
{
|
||||
if (doRead)
|
||||
{
|
||||
@ -1094,7 +1096,7 @@ bool SecureSocketImpl::serverHandshakeLoop(PCtxtHandle phContext, PCredHandle ph
|
||||
throw SSLException("Failed to receive data in handshake");
|
||||
else
|
||||
_recvBufferOffset += n;
|
||||
}
|
||||
}
|
||||
else doRead = true;
|
||||
}
|
||||
|
||||
@ -1132,8 +1134,8 @@ bool SecureSocketImpl::serverHandshakeLoop(PCtxtHandle phContext, PCredHandle ph
|
||||
{
|
||||
std::memmove(_recvBuffer.begin(), _recvBuffer.begin() + (_recvBufferOffset - inBuffer[1].cbBuffer), inBuffer[1].cbBuffer);
|
||||
_recvBufferOffset = inBuffer[1].cbBuffer;
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
_recvBufferOffset = 0;
|
||||
}
|
||||
@ -1151,7 +1153,7 @@ bool SecureSocketImpl::serverHandshakeLoop(PCtxtHandle phContext, PCredHandle ph
|
||||
std::memmove(_recvBuffer.begin(), _recvBuffer.begin() + (_recvBufferOffset - inBuffer[1].cbBuffer), inBuffer[1].cbBuffer);
|
||||
_recvBufferOffset = inBuffer[1].cbBuffer;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
_recvBufferOffset = 0;
|
||||
}
|
||||
@ -1164,12 +1166,12 @@ bool SecureSocketImpl::serverHandshakeLoop(PCtxtHandle phContext, PCredHandle ph
|
||||
|
||||
void SecureSocketImpl::clientVerifyCertificate(const std::string& hostName)
|
||||
{
|
||||
if (_pContext->verificationMode() == Context::VERIFY_NONE) return;
|
||||
if (_pContext->verificationMode() == Context::VERIFY_NONE) return;
|
||||
if (!_pPeerCertificate) throw SSLException("No Server certificate");
|
||||
if (hostName.empty()) throw SSLException("Server name not set");
|
||||
|
||||
X509Certificate cert(_pPeerCertificate, true);
|
||||
|
||||
|
||||
if (!cert.verify(hostName))
|
||||
{
|
||||
VerificationErrorArgs args(cert, 0, SEC_E_CERT_EXPIRED, "The certificate host names do not match the server host name");
|
||||
@ -1178,7 +1180,7 @@ void SecureSocketImpl::clientVerifyCertificate(const std::string& hostName)
|
||||
throw InvalidCertificateException("Host name verification failed");
|
||||
}
|
||||
|
||||
verifyCertificateChainClient(_pPeerCertificate);
|
||||
verifyCertificateChainClient(_pPeerCertificate);
|
||||
}
|
||||
|
||||
|
||||
@ -1204,7 +1206,7 @@ void SecureSocketImpl::verifyCertificateChainClient(PCCERT_CONTEXT pServerCert)
|
||||
throw SSLException("Cannot get certificate chain", GetLastError());
|
||||
}
|
||||
|
||||
HTTPSPolicyCallbackData polHttps;
|
||||
HTTPSPolicyCallbackData polHttps;
|
||||
std::memset(&polHttps, 0, sizeof(HTTPSPolicyCallbackData));
|
||||
polHttps.cbStruct = sizeof(HTTPSPolicyCallbackData);
|
||||
polHttps.dwAuthType = AUTHTYPE_SERVER;
|
||||
@ -1309,14 +1311,14 @@ void SecureSocketImpl::verifyCertificateChainClient(PCCERT_CONTEXT pServerCert)
|
||||
|
||||
void SecureSocketImpl::serverVerifyCertificate()
|
||||
{
|
||||
if (_pContext->verificationMode() < Context::VERIFY_STRICT) return;
|
||||
if (_pContext->verificationMode() < Context::VERIFY_STRICT) return;
|
||||
|
||||
// we are now in Strict mode
|
||||
if (!_pPeerCertificate) throw SSLException("No client certificate");
|
||||
|
||||
DWORD status = SEC_E_OK;
|
||||
X509Certificate cert(_pPeerCertificate, true);
|
||||
|
||||
|
||||
PCCERT_CHAIN_CONTEXT pChainContext = NULL;
|
||||
CERT_CHAIN_PARA chainPara;
|
||||
std::memset(&chainPara, 0, sizeof(chainPara));
|
||||
@ -1330,7 +1332,7 @@ void SecureSocketImpl::serverVerifyCertificate()
|
||||
&chainPara,
|
||||
CERT_CHAIN_REVOCATION_CHECK_CHAIN,
|
||||
NULL,
|
||||
&pChainContext))
|
||||
&pChainContext))
|
||||
{
|
||||
throw SSLException("Cannot get certificate chain", GetLastError());
|
||||
}
|
||||
@ -1351,37 +1353,37 @@ void SecureSocketImpl::serverVerifyCertificate()
|
||||
std::memset(&policyStatus, 0, sizeof(policyStatus));
|
||||
policyStatus.cbSize = sizeof(policyStatus);
|
||||
|
||||
if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, pChainContext, &policyPara, &policyStatus))
|
||||
if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, pChainContext, &policyPara, &policyStatus))
|
||||
{
|
||||
VerificationErrorArgs args(cert, 0, GetLastError(), "Failed to verify certificate chain");
|
||||
SSLManager::instance().ServerVerificationError(this, args);
|
||||
CertFreeCertificateChain(pChainContext);
|
||||
if (!args.getIgnoreError())
|
||||
if (!args.getIgnoreError())
|
||||
throw SSLException("Cannot verify certificate chain");
|
||||
else
|
||||
return;
|
||||
}
|
||||
else if (policyStatus.dwError)
|
||||
else if (policyStatus.dwError)
|
||||
{
|
||||
VerificationErrorArgs args(cert, policyStatus.lElementIndex, status, Utility::formatError(policyStatus.dwError));
|
||||
SSLManager::instance().ServerVerificationError(this, args);
|
||||
CertFreeCertificateChain(pChainContext);
|
||||
if (!args.getIgnoreError())
|
||||
throw SSLException("Failed to verify certificate chain");
|
||||
else
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
#if !defined(_WIN32_WCE)
|
||||
// perform revocation checking
|
||||
for (DWORD i = 0; i < pChainContext->cChain; i++)
|
||||
for (DWORD i = 0; i < pChainContext->cChain; i++)
|
||||
{
|
||||
std::vector<PCCERT_CONTEXT> certs;
|
||||
for (DWORD k = 0; k < pChainContext->rgpChain[i]->cElement; k++)
|
||||
{
|
||||
certs.push_back(pChainContext->rgpChain[i]->rgpElement[k]->pCertContext);
|
||||
}
|
||||
|
||||
|
||||
CERT_REVOCATION_STATUS revStat;
|
||||
revStat.cbSize = sizeof(CERT_REVOCATION_STATUS);
|
||||
|
||||
@ -1405,7 +1407,7 @@ void SecureSocketImpl::serverVerifyCertificate()
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (pChainContext)
|
||||
if (pChainContext)
|
||||
{
|
||||
CertFreeCertificateChain(pChainContext);
|
||||
}
|
||||
@ -1467,7 +1469,7 @@ LONG SecureSocketImpl::serverDisconnect(PCredHandle phCreds, CtxtHandle* phConte
|
||||
}
|
||||
|
||||
AutoSecBufferDesc<1> tokBuffer(&_securityFunctions, false);
|
||||
|
||||
|
||||
DWORD tokenType = SCHANNEL_SHUTDOWN;
|
||||
tokBuffer.setSecBufferToken(0, &tokenType, sizeof(tokenType));
|
||||
DWORD status = _securityFunctions.ApplyControlToken(phContext, &tokBuffer);
|
||||
@ -1475,9 +1477,9 @@ LONG SecureSocketImpl::serverDisconnect(PCredHandle phCreds, CtxtHandle* phConte
|
||||
if (FAILED(status)) return status;
|
||||
|
||||
DWORD sspiFlags = ASC_REQ_SEQUENCE_DETECT
|
||||
| ASC_REQ_REPLAY_DETECT
|
||||
| ASC_REQ_CONFIDENTIALITY
|
||||
| ASC_REQ_EXTENDED_ERROR
|
||||
| ASC_REQ_REPLAY_DETECT
|
||||
| ASC_REQ_CONFIDENTIALITY
|
||||
| ASC_REQ_EXTENDED_ERROR
|
||||
| ASC_REQ_ALLOCATE_MEMORY
|
||||
| ASC_REQ_STREAM;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user