Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 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 #ifndef NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_ | |
| 6 #define NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "base/compiler_specific.h" | |
| 10 #include "base/memory/scoped_ptr.h" | |
| 11 #include "net/base/net_export.h" | |
| 12 | |
| 13 namespace net { | |
| 14 | |
| 15 namespace der { | |
| 16 class Input; | |
| 17 } | |
|
Ryan Sleevi
2015/07/07 13:55:15
nit: } // namespace der
eroman
2015/07/08 01:09:34
Done.
| |
| 18 | |
| 19 // Enumeration that describes a (parameter-less) hashing algorithm. | |
|
Ryan Sleevi
2015/07/07 13:55:15
nit: This comment doesn't seem to really add much.
eroman
2015/07/08 01:09:34
Done.
| |
| 20 enum class DigestAlgorithm { | |
| 21 Sha1, | |
| 22 Sha256, | |
| 23 Sha384, | |
| 24 Sha512, | |
| 25 }; | |
| 26 | |
| 27 // Enumeration that describes a class of algorithm (the parameters to the | |
| 28 // algorithm are specified separately). | |
|
Ryan Sleevi
2015/07/07 13:55:15
// The signature scheme used within a signature. P
eroman
2015/07/08 01:09:34
Done.
| |
| 29 enum class SignatureAlgorithmId { | |
| 30 RsaPkcs1, // RSA PKCS#1 v1.5 | |
| 31 RsaPss, // RSASSA-PSS | |
| 32 Ecdsa, // ECDSA | |
| 33 }; | |
| 34 | |
| 35 // Base class for describing algorithm parameters. | |
| 36 class NET_EXPORT SignatureAlgorithmParameters { | |
| 37 public: | |
| 38 SignatureAlgorithmParameters() {} | |
| 39 virtual ~SignatureAlgorithmParameters(){}; | |
| 40 | |
| 41 // Returns true if the two parameters are identical. This must only be called | |
| 42 // with instances of the same type (so it is safe for implementations to | |
| 43 // cast). | |
| 44 virtual bool Equals(const SignatureAlgorithmParameters* other) const = 0; | |
| 45 | |
| 46 private: | |
| 47 DISALLOW_COPY_AND_ASSIGN(SignatureAlgorithmParameters); | |
| 48 }; | |
| 49 | |
| 50 // Parameters for an RSASSA-PSS signature algorithm. | |
| 51 // | |
| 52 // The trailer is assumed to be 1, and the mask gen to be MGF1. | |
|
Ryan Sleevi
2015/07/07 13:55:15
Why?
eroman
2015/07/08 01:09:34
Why not?
I don't see any support in BoringSSL for
Ryan Sleevi
2015/07/08 11:44:01
Sorry for being opaque, especially with the round-
eroman
2015/07/14 20:31:39
Done.
| |
| 53 class NET_EXPORT RsaPssParameters : public SignatureAlgorithmParameters { | |
| 54 public: | |
| 55 RsaPssParameters(DigestAlgorithm mgf1_hash, uint32_t salt_length); | |
| 56 | |
| 57 bool Equals(const SignatureAlgorithmParameters* other) const override; | |
| 58 | |
| 59 DigestAlgorithm mgf1_hash() const { return mgf1_hash_; } | |
| 60 uint32_t salt_length() const { return salt_length_; } | |
| 61 | |
| 62 private: | |
| 63 const DigestAlgorithm mgf1_hash_; | |
| 64 const uint32_t salt_length_; | |
| 65 }; | |
| 66 | |
| 67 // SignatureAlgorithm describes a signature algorithm and its parameters. This | |
| 68 // corresponds to "AlgorithmIdentifier" from RFC 5280. | |
| 69 class NET_EXPORT SignatureAlgorithm { | |
| 70 public: | |
| 71 // Creates an empty (invalid) signature algorithm. Callers should use one of | |
| 72 // the Assign* methods to initialize it. | |
| 73 SignatureAlgorithm(); | |
|
Ryan Sleevi
2015/07/07 13:55:15
Why init+Assign vs a factory create? Is the assump
eroman
2015/07/08 01:09:34
Using factory methods creates the need to support
Ryan Sleevi
2015/07/08 11:49:05
Sorry, by factory method I meant something like
s
eroman
2015/07/14 20:31:39
Done.
(Except renamed ParseDer --> CreateFromDer()
| |
| 74 ~SignatureAlgorithm(); | |
| 75 | |
| 76 // Returns true if the SignatureAlgorithm has been initialized. Accessors | |
| 77 // should not be called on invalid SignatureAlgorithms. | |
| 78 // | |
| 79 // Note that IsValid() does not imply that the algorithm and its parameters | |
| 80 // are valid in a cryptographic sense, just that the object itself has been | |
| 81 // initialized. | |
| 82 bool IsValid() const WARN_UNUSED_RESULT; | |
| 83 | |
| 84 SignatureAlgorithmId algorithm() const; | |
| 85 DigestAlgorithm digest() const; | |
| 86 | |
| 87 // Assigns the SignatureAlgorithm by parsing a DER-encoded | |
| 88 // "AlgorithmIdentifier" (RFC 5280). Returns true on success. | |
| 89 bool ParseDer(const der::Input& algorithm_identifier) WARN_UNUSED_RESULT; | |
| 90 | |
| 91 // Sets the SignatureAlgorithm to the given type and parameters. | |
| 92 void AssignRsaPkcs1(DigestAlgorithm digest); | |
| 93 void AssignEcdsa(DigestAlgorithm digest); | |
| 94 void AssignRsaPss(DigestAlgorithm digest, | |
| 95 DigestAlgorithm mgf1_hash, | |
| 96 uint32_t salt_length); | |
| 97 | |
| 98 // Returns true if |*this| is equivalent to |other|. This compares both the | |
| 99 // algorithm ID and each parameter for equality. | |
| 100 bool Equals(const SignatureAlgorithm& other) const WARN_UNUSED_RESULT; | |
| 101 | |
| 102 // The following methods retrieve the parameters for the signature algorithm. | |
| 103 // | |
| 104 // The correct parameters should be chosen based on the algorithm ID. For | |
| 105 // instance a SignatureAlgorithm with |algorithm() == RsaPss| should retrieve | |
| 106 // parameters via ParametersForRsaPss(). | |
| 107 // | |
| 108 // The returned pointer is non-owned, and will be valid only as long as the | |
| 109 // parameters remain alive. This correspond with the lifetime of the | |
| 110 // SignatureAlgorithm, provided there are no intervening calls to Assign*() or | |
| 111 // Parse*(). | |
| 112 const RsaPssParameters* ParamsForRsaPss() const; | |
| 113 | |
| 114 private: | |
| 115 // Clears the SignatureAlgorithm, rendering it in an invalid state as if it | |
| 116 // had just been default-constructed. | |
| 117 void AssignInvalid(); | |
| 118 | |
| 119 SignatureAlgorithmId algorithm_; | |
| 120 DigestAlgorithm digest_; | |
| 121 scoped_ptr<SignatureAlgorithmParameters> params_; | |
| 122 | |
| 123 DISALLOW_COPY_AND_ASSIGN(SignatureAlgorithm); | |
| 124 }; | |
| 125 | |
| 126 } // namespace net | |
| 127 | |
| 128 #endif // NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_ | |
| OLD | NEW |