Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: webrtc/base/sslidentity.h

Issue 1329493005: Provide RSA2048 as per RFC (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Address hbos' concerns Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 // Handling of certificates and keypairs for SSLStreamAdapter's peer mode. 11 // Handling of certificates and keypairs for SSLStreamAdapter's peer mode.
12 12
13 #ifndef WEBRTC_BASE_SSLIDENTITY_H_ 13 #ifndef WEBRTC_BASE_SSLIDENTITY_H_
14 #define WEBRTC_BASE_SSLIDENTITY_H_ 14 #define WEBRTC_BASE_SSLIDENTITY_H_
15 15
16 #include <algorithm> 16 #include <algorithm>
17 #include <string> 17 #include <string>
18 #include <vector> 18 #include <vector>
19 19
20 #include "webrtc/base/buffer.h" 20 #include "webrtc/base/buffer.h"
21 #include "webrtc/base/checks.h"
21 #include "webrtc/base/messagedigest.h" 22 #include "webrtc/base/messagedigest.h"
22 23
23 namespace rtc { 24 namespace rtc {
24 25
25 // Forward declaration due to circular dependency with SSLCertificate. 26 // Forward declaration due to circular dependency with SSLCertificate.
26 class SSLCertChain; 27 class SSLCertChain;
27 28
28 // Abstract interface overridden by SSL library specific 29 // Abstract interface overridden by SSL library specific
29 // implementations. 30 // implementations.
30 31
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 } 101 }
101 102
102 // Helper function for deleting a vector of certificates. 103 // Helper function for deleting a vector of certificates.
103 static void DeleteCert(SSLCertificate* cert) { delete cert; } 104 static void DeleteCert(SSLCertificate* cert) { delete cert; }
104 105
105 std::vector<SSLCertificate*> certs_; 106 std::vector<SSLCertificate*> certs_;
106 107
107 RTC_DISALLOW_COPY_AND_ASSIGN(SSLCertChain); 108 RTC_DISALLOW_COPY_AND_ASSIGN(SSLCertChain);
108 }; 109 };
109 110
111 // KT_DEFAULT is currently an alias for KT_RSA. This is likely to change.
112 // KT_LAST is intended for vector declarations and loops over all key types;
113 // it does not represent any key type in itself.
110 // TODO(hbos,torbjorng): Don't change KT_DEFAULT without first updating 114 // TODO(hbos,torbjorng): Don't change KT_DEFAULT without first updating
111 // PeerConnectionFactory_nativeCreatePeerConnection's certificate generation 115 // PeerConnectionFactory_nativeCreatePeerConnection's certificate generation
112 // code. 116 // code.
113 enum KeyType { KT_RSA, KT_ECDSA, KT_LAST, KT_DEFAULT = KT_RSA }; 117 enum KeyType { KT_RSA, KT_ECDSA, KT_LAST, KT_INVALID, KT_DEFAULT = KT_RSA };
juberti 2015/10/07 06:35:22 I didn't see any usage of KT_LAST in this CL. I co
hbos 2015/10/07 10:04:40 It is used today by dtlsidentitystore.h. It is pro
torbjorng (webrtc) 2015/10/07 13:30:03 I have the habit of putting in a _LAST in order fo
118
119 static const int kRsaDefaultModSize = 1024;
120 static const int kRsaDefaultExponent = 0x10001; // = 2^16+1 = 65537
121
122 struct RSAParams {
123 unsigned int mod_size;
124 unsigned int pub_exp;
125 };
126
127 enum ECCurve { EC_NIST_P256, /* EC_FANCY, */ EC_LAST };
128
129 class KeyParams {
130 public:
131 // Default ctor only needed by gtest, it would be nice to avoid this.
132 // We set grossly invalid parameters to discourage its use.
133 KeyParams() {
juberti 2015/10/07 06:35:22 This seems wrong to me. Why not init with KT_DEFAU
hbos 2015/10/07 10:04:40 (I would also prefer default constructor to create
torbjorng (webrtc) 2015/10/07 13:30:04 OK, I'll revert to that form.
134 type_ = KT_INVALID; // Bad type.
135 memset(&params_, 0xff, sizeof(params_)); // Bad values.
136 }
137
138 // Generate a KeyParams object from a simple KeyType, using default params.
139 explicit KeyParams(KeyType key_type) {
140 if (key_type == KT_ECDSA) {
141 type_ = KT_ECDSA;
142 params_.curve = EC_NIST_P256;
143 } else if (key_type == KT_RSA) {
144 type_ = KT_RSA;
145 params_.rsa.mod_size = kRsaDefaultModSize;
146 params_.rsa.pub_exp = kRsaDefaultExponent;
147 } else {
148 RTC_NOTREACHED();
149 }
150 }
151
152 // Generate a a KeyParams for RSA with explicit parameters.
153 static KeyParams RSA(int mod_size, int pub_exp) {
juberti 2015/10/07 06:35:22 I looked and you are correct; the style guide does
hbos 2015/10/07 10:04:40 Yay!
torbjorng (webrtc) 2015/10/07 13:30:03 Great! The style guide is not 100% clear here.
154 KeyParams kt(KT_RSA);
155 kt.params_.rsa.mod_size = mod_size;
156 kt.params_.rsa.pub_exp = pub_exp;
157 return kt;
158 }
159
160 // Generate a a KeyParams for RSA defaulting parameters.
161 static KeyParams RSA() {
162 KeyParams kt(KT_RSA);
163 kt.params_.rsa.mod_size = kRsaDefaultModSize;
164 kt.params_.rsa.pub_exp = kRsaDefaultExponent;
165 return kt;
166 }
167
168 // Generate a a KeyParams for ECDSA specifying the curve.
169 static KeyParams ECDSA(ECCurve curve) {
170 KeyParams kt(KT_ECDSA);
171 kt.params_.curve = curve;
172 return kt;
173 }
174
175 // Generate a a KeyParams for ECDSA defaulting the curve.
176 static KeyParams ECDSA() {
177 KeyParams kt(KT_ECDSA);
178 kt.params_.curve = EC_NIST_P256;
179 return kt;
180 }
181
182 // Check validity of a KeyParams object. Since the factory functions have
183 // no way of returning errors, this function can be called after creation
184 // to make sure the parameters are OK.
185 bool IsValid() {
186 if (type_ == KT_RSA) {
187 return (params_.rsa.mod_size >= 1024 && params_.rsa.mod_size <= 8192 &&
juberti 2015/10/07 06:35:22 These should probably be constants.
torbjorng (webrtc) 2015/10/07 13:30:04 Done.
188 params_.rsa.pub_exp > params_.rsa.mod_size);
189 } else if (type_ == KT_ECDSA) {
190 return (params_.curve == EC_NIST_P256);
191 }
192 return false;
193 }
194
195 RSAParams rsa_params() const {
196 RTC_DCHECK(type_ == KT_RSA);
197 return params_.rsa;
198 }
199
200 ECCurve ec_curve() const {
201 RTC_DCHECK(type_ == KT_ECDSA);
202 return params_.curve;
203 }
204
205 KeyType type() const { return type_; }
206
207 private:
208 KeyType type_;
209 union {
210 RSAParams rsa;
211 ECCurve curve;
212 } params_;
213 };
114 214
115 // TODO(hbos): Remove once rtc::KeyType (to be modified) and 215 // TODO(hbos): Remove once rtc::KeyType (to be modified) and
116 // blink::WebRTCKeyType (to be landed) match. By using this function in Chromium 216 // blink::WebRTCKeyType (to be landed) match. By using this function in Chromium
117 // appropriately we can change KeyType enum -> class without breaking Chromium. 217 // appropriately we can change KeyType enum -> class without breaking Chromium.
118 KeyType IntKeyTypeFamilyToKeyType(int key_type_family); 218 KeyType IntKeyTypeFamilyToKeyType(int key_type_family);
119 219
120 // Parameters for generating an identity for testing. If common_name is 220 // Parameters for generating a certificate. If |common_name| is non-empty, it
121 // non-empty, it will be used for the certificate's subject and issuer name, 221 // will be used for the certificate's subject and issuer name, otherwise a
122 // otherwise a random string will be used. |not_before| and |not_after| are 222 // random string will be used.
123 // offsets to the current time in number of seconds.
124 struct SSLIdentityParams { 223 struct SSLIdentityParams {
224 SSLIdentityParams(const KeyParams& key_params) : key_params(key_params) {}
juberti 2015/10/07 06:35:22 It seems odd to have a ctor that only initializes
torbjorng (webrtc) 2015/10/07 13:30:03 Ack. It ended up like this since the KeyParams de
225
125 std::string common_name; 226 std::string common_name;
126 int not_before; // in seconds. 227 int not_before; // offset from current time in seconds.
127 int not_after; // in seconds. 228 int not_after; // offset from current time in seconds.
128 KeyType key_type; 229 KeyParams key_params;
129 }; 230 };
130 231
131 // Our identity in an SSL negotiation: a keypair and certificate (both 232 // Our identity in an SSL negotiation: a keypair and certificate (both
132 // with the same public key). 233 // with the same public key).
133 // This too is pretty much immutable once created. 234 // This too is pretty much immutable once created.
134 class SSLIdentity { 235 class SSLIdentity {
135 public: 236 public:
136 // Generates an identity (keypair and self-signed certificate). If 237 // Generates an identity (keypair and self-signed certificate). If
137 // common_name is non-empty, it will be used for the certificate's 238 // common_name is non-empty, it will be used for the certificate's
138 // subject and issuer name, otherwise a random string will be used. 239 // subject and issuer name, otherwise a random string will be used.
139 // Returns NULL on failure. 240 // Returns NULL on failure.
140 // Caller is responsible for freeing the returned object. 241 // Caller is responsible for freeing the returned object.
141 static SSLIdentity* Generate(const std::string& common_name, 242 static SSLIdentity* Generate(const std::string& common_name,
142 KeyType key_type); 243 const KeyParams& key_param);
244 static SSLIdentity* Generate(const std::string& common_name,
245 KeyType key_type) {
246 return Generate(common_name, KeyParams(key_type));
247 }
143 248
144 // Generates an identity with the specified validity period. 249 // Generates an identity with the specified validity period.
145 static SSLIdentity* GenerateForTest(const SSLIdentityParams& params); 250 static SSLIdentity* GenerateForTest(const SSLIdentityParams& params);
146 251
147 // Construct an identity from a private key and a certificate. 252 // Construct an identity from a private key and a certificate.
148 static SSLIdentity* FromPEMStrings(const std::string& private_key, 253 static SSLIdentity* FromPEMStrings(const std::string& private_key,
149 const std::string& certificate); 254 const std::string& certificate);
150 255
151 virtual ~SSLIdentity() {} 256 virtual ~SSLIdentity() {}
152 257
(...skipping 15 matching lines...) Expand all
168 size_t length); 273 size_t length);
169 }; 274 };
170 275
171 extern const char kPemTypeCertificate[]; 276 extern const char kPemTypeCertificate[];
172 extern const char kPemTypeRsaPrivateKey[]; 277 extern const char kPemTypeRsaPrivateKey[];
173 extern const char kPemTypeEcPrivateKey[]; 278 extern const char kPemTypeEcPrivateKey[];
174 279
175 } // namespace rtc 280 } // namespace rtc
176 281
177 #endif // WEBRTC_BASE_SSLIDENTITY_H_ 282 #endif // WEBRTC_BASE_SSLIDENTITY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698