• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/base/x509_openssl_util.h"
6 
7 #include <algorithm>
8 
9 #include "base/logging.h"
10 #include "base/string_piece.h"
11 #include "net/base/x509_cert_types.h"
12 
13 namespace net {
14 
15 namespace x509_openssl_util {
16 
ParsePrincipalKeyAndValueByIndex(X509_NAME * name,int index,std::string * key,std::string * value)17 bool ParsePrincipalKeyAndValueByIndex(X509_NAME* name,
18                                       int index,
19                                       std::string* key,
20                                       std::string* value) {
21   X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, index);
22   if (!entry)
23     return false;
24 
25   if (key) {
26     ASN1_OBJECT* object = X509_NAME_ENTRY_get_object(entry);
27     key->assign(OBJ_nid2sn(OBJ_obj2nid(object)));
28   }
29 
30   ASN1_STRING* data = X509_NAME_ENTRY_get_data(entry);
31   if (!data)
32     return false;
33 
34   unsigned char* buf = NULL;
35   int len = ASN1_STRING_to_UTF8(&buf, data);
36   if (len <= 0)
37     return false;
38 
39   value->assign(reinterpret_cast<const char*>(buf), len);
40   OPENSSL_free(buf);
41   return true;
42 }
43 
ParsePrincipalValueByIndex(X509_NAME * name,int index,std::string * value)44 bool ParsePrincipalValueByIndex(X509_NAME* name,
45                                 int index,
46                                 std::string* value) {
47   return ParsePrincipalKeyAndValueByIndex(name, index, NULL, value);
48 }
49 
ParsePrincipalValueByNID(X509_NAME * name,int nid,std::string * value)50 bool ParsePrincipalValueByNID(X509_NAME* name, int nid, std::string* value) {
51   int index = X509_NAME_get_index_by_NID(name, nid, -1);
52   if (index < 0)
53     return false;
54 
55   return ParsePrincipalValueByIndex(name, index, value);
56 }
57 
ParseDate(ASN1_TIME * x509_time,base::Time * time)58 bool ParseDate(ASN1_TIME* x509_time, base::Time* time) {
59   if (!x509_time ||
60       (x509_time->type != V_ASN1_UTCTIME &&
61        x509_time->type != V_ASN1_GENERALIZEDTIME))
62     return false;
63 
64   base::StringPiece str_date(reinterpret_cast<const char*>(x509_time->data),
65                              x509_time->length);
66 
67   CertDateFormat format = x509_time->type == V_ASN1_UTCTIME ?
68       CERT_DATE_FORMAT_UTC_TIME : CERT_DATE_FORMAT_GENERALIZED_TIME;
69   return ParseCertificateDate(str_date, format, time);
70 }
71 
72 }  // namespace x509_openssl_util
73 
74 }  // namespace net
75