Skip to content

Commit

Permalink
Bug 1317657 - Test for multiple certificates. r=mt
Browse files Browse the repository at this point in the history
Reviewers: mt

Differential Revision: https://nss-review.dev.mozaws.net/D65
  • Loading branch information
ekr committed Nov 15, 2016
1 parent 8075bff commit 0d5c7b0
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 1 deletion.
2 changes: 2 additions & 0 deletions gtests/common/scoped_ptrs.h
Expand Up @@ -16,6 +16,7 @@ namespace nss_test {

struct ScopedDelete {
void operator()(CERTCertificate* cert) { CERT_DestroyCertificate(cert); }
void operator()(CERTCertificateList* list) { CERT_DestroyCertificateList(list); }
void operator()(CERTSubjectPublicKeyInfo* spki) {
SECKEY_DestroySubjectPublicKeyInfo(spki);
}
Expand All @@ -40,6 +41,7 @@ struct ScopedMaybeDelete {
#define SCOPED(x) typedef std::unique_ptr<x, ScopedMaybeDelete<x> > Scoped##x

SCOPED(CERTCertificate);
SCOPED(CERTCertificateList);
SCOPED(CERTSubjectPublicKeyInfo);
SCOPED(PK11SlotInfo);
SCOPED(PK11SymKey);
Expand Down
9 changes: 9 additions & 0 deletions gtests/ssl_gtest/ssl_auth_unittest.cc
Expand Up @@ -28,6 +28,15 @@ TEST_P(TlsConnectGeneric, ServerAuthBigRsa) {
CheckKeys();
}

TEST_P(TlsConnectGeneric, ServerAuthRsaChain) {
Reset(TlsAgent::kServerRsaChain);
Connect();
CheckKeys();
size_t chain_length;
EXPECT_TRUE(client_->GetPeerChainLength(&chain_length));
EXPECT_EQ(2UL, chain_length);
}

TEST_P(TlsConnectGeneric, ClientAuth) {
client_->SetupClientAuth();
server_->RequestClientAuth(true);
Expand Down
20 changes: 20 additions & 0 deletions gtests/ssl_gtest/tls_agent.cc
Expand Up @@ -35,6 +35,7 @@ const std::string TlsAgent::kServerRsa = "rsa"; // both sign and encrypt
const std::string TlsAgent::kServerRsaSign = "rsa_sign";
const std::string TlsAgent::kServerRsaPss = "rsa_pss";
const std::string TlsAgent::kServerRsaDecrypt = "rsa_decrypt";
const std::string TlsAgent::kServerRsaChain = "rsa_chain";
const std::string TlsAgent::kServerEcdsa256 = "ecdsa256";
const std::string TlsAgent::kServerEcdsa384 = "ecdsa384";
const std::string TlsAgent::kServerEcdsa521 = "ecdsa521";
Expand Down Expand Up @@ -201,6 +202,25 @@ SECStatus TlsAgent::GetClientAuthDataHook(void* self, PRFileDesc* fd,
return SECFailure;
}

bool TlsAgent::GetPeerChainLength(size_t* count) {
CERTCertList *chain = SSL_PeerCertificateChain(ssl_fd_);
if (!chain)
return false;
*count = 0;

for (PRCList *cursor = PR_NEXT_LINK(&chain->list);
cursor != &chain->list;
cursor = PR_NEXT_LINK(cursor)) {
CERTCertListNode *node = (CERTCertListNode *)cursor;
std::cerr << node->cert->subjectName << std::endl;
++(*count);
}

CERT_DestroyCertList(chain);

return true;
}

void TlsAgent::RequestClientAuth(bool requireAuth) {
EXPECT_TRUE(EnsureTlsSetup());
ASSERT_EQ(SERVER, role_);
Expand Down
3 changes: 3 additions & 0 deletions gtests/ssl_gtest/tls_agent.h
Expand Up @@ -62,6 +62,7 @@ class TlsAgent : public PollTarget {
static const std::string kServerRsaSign;
static const std::string kServerRsaPss;
static const std::string kServerRsaDecrypt;
static const std::string kServerRsaChain; // A cert that requires a chain.
static const std::string kServerEcdsa256;
static const std::string kServerEcdsa384;
static const std::string kServerEcdsa521;
Expand Down Expand Up @@ -108,6 +109,7 @@ class TlsAgent : public PollTarget {
void StartRenegotiate();
bool ConfigServerCert(const std::string& name, bool updateKeyBits = false,
const SSLExtraServerCertData* serverCertData = nullptr);
bool ConfigServerCertWithChain(const std::string& name);
bool EnsureTlsSetup(PRFileDesc* modelSocket = nullptr);

void SetupClientAuth();
Expand Down Expand Up @@ -151,6 +153,7 @@ class TlsAgent : public PollTarget {
void CheckSecretsDestroyed();
void ConfigNamedGroups(const std::vector<SSLNamedGroup>& groups);
void DisableECDHEServerKeyReuse();
bool GetPeerChainLength(size_t* count);

const std::string& name() const { return name_; }

Expand Down
4 changes: 3 additions & 1 deletion tests/ssl_gtests/ssl_gtests.sh
Expand Up @@ -50,13 +50,14 @@ make_cert() {
p384) type_args='-q secp384r1';type=ec ;;
p521) type_args='-q secp521r1';type=ec ;;
rsa_ca) type_args='-g 1024';trust='CT,CT,CT';ca=y;type=rsa ;;
rsa_chain) type_args='-g 1024';sign='-c rsa_ca';type=rsa;;
ecdh_rsa) type_args='-q nistp256';sign='-c rsa_ca';type=ec ;;
esac
shift 2
counter=$(($counter + 1))
certscript $@ | ${BINDIR}/certutil -S \
-z ${R_NOISE_FILE} -d "${PROFILEDIR}" \
-n $name -s "CN=$name" -t ${trust:-C,C,C} ${sign:--x} -m $counter \
-n $name -s "CN=$name" -t ${trust:-,,} ${sign:--x} -m $counter \
-w -2 -v 120 -k $type $type_args -Z SHA256 -1 -2
html_msg $? 0 "create certificate: $@"
}
Expand Down Expand Up @@ -85,6 +86,7 @@ ssl_gtest_certs() {
make_cert ecdsa521 p521 sign
make_cert ecdh_ecdsa p256 kex
make_cert rsa_ca rsa_ca ca
make_cert rsa_chain rsa_chain sign
make_cert ecdh_rsa ecdh_rsa kex
make_cert dsa dsa sign
}
Expand Down

0 comments on commit 0d5c7b0

Please sign in to comment.