OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/platform_keys/platform_keys.h" | 5 #include "chrome/browser/chromeos/platform_keys/platform_keys.h" |
6 | 6 |
7 #include <cert.h> | 7 #include <cert.h> |
8 #include <cryptohi.h> | 8 #include <cryptohi.h> |
9 #include <keyhi.h> | 9 #include <keyhi.h> |
10 #include <secder.h> | 10 #include <secder.h> |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 scoped_ptr<SelectCertificatesState> state(new SelectCertificatesState( | 769 scoped_ptr<SelectCertificatesState> state(new SelectCertificatesState( |
770 user->username_hash(), use_system_key_slot, cert_request_info, callback)); | 770 user->username_hash(), use_system_key_slot, cert_request_info, callback)); |
771 | 771 |
772 BrowserThread::PostTask( | 772 BrowserThread::PostTask( |
773 BrowserThread::IO, FROM_HERE, | 773 BrowserThread::IO, FROM_HERE, |
774 base::Bind(&SelectCertificatesOnIOThread, base::Passed(&state))); | 774 base::Bind(&SelectCertificatesOnIOThread, base::Passed(&state))); |
775 } | 775 } |
776 | 776 |
777 } // namespace subtle | 777 } // namespace subtle |
778 | 778 |
| 779 std::string GetSubjectPublicKeyInfo( |
| 780 const scoped_refptr<net::X509Certificate>& certificate) { |
| 781 const SECItem& spki_der = certificate->os_cert_handle()->derPublicKey; |
| 782 return std::string(spki_der.data, spki_der.data + spki_der.len); |
| 783 } |
| 784 |
779 bool GetPublicKey(const scoped_refptr<net::X509Certificate>& certificate, | 785 bool GetPublicKey(const scoped_refptr<net::X509Certificate>& certificate, |
780 std::string* public_key_spki_der, | |
781 net::X509Certificate::PublicKeyType* key_type, | 786 net::X509Certificate::PublicKeyType* key_type, |
782 size_t* key_size_bits) { | 787 size_t* key_size_bits) { |
783 const SECItem& spki_der = certificate->os_cert_handle()->derPublicKey; | |
784 | |
785 net::X509Certificate::PublicKeyType key_type_tmp = | 788 net::X509Certificate::PublicKeyType key_type_tmp = |
786 net::X509Certificate::kPublicKeyTypeUnknown; | 789 net::X509Certificate::kPublicKeyTypeUnknown; |
787 size_t key_size_bits_tmp = 0; | 790 size_t key_size_bits_tmp = 0; |
788 net::X509Certificate::GetPublicKeyInfo(certificate->os_cert_handle(), | 791 net::X509Certificate::GetPublicKeyInfo(certificate->os_cert_handle(), |
789 &key_size_bits_tmp, &key_type_tmp); | 792 &key_size_bits_tmp, &key_type_tmp); |
790 | 793 |
791 if (key_type_tmp == net::X509Certificate::kPublicKeyTypeUnknown) { | 794 if (key_type_tmp == net::X509Certificate::kPublicKeyTypeUnknown) { |
792 LOG(WARNING) << "Could not extract public key of certificate."; | 795 LOG(WARNING) << "Could not extract public key of certificate."; |
793 return false; | 796 return false; |
794 } | 797 } |
795 if (key_type_tmp != net::X509Certificate::kPublicKeyTypeRSA) { | 798 if (key_type_tmp != net::X509Certificate::kPublicKeyTypeRSA) { |
796 LOG(WARNING) << "Keys of other type than RSA are not supported."; | 799 LOG(WARNING) << "Keys of other type than RSA are not supported."; |
797 return false; | 800 return false; |
798 } | 801 } |
799 | 802 |
800 crypto::ScopedSECKEYPublicKey public_key( | 803 crypto::ScopedSECKEYPublicKey public_key( |
801 CERT_ExtractPublicKey(certificate->os_cert_handle())); | 804 CERT_ExtractPublicKey(certificate->os_cert_handle())); |
802 if (!public_key) { | 805 if (!public_key) { |
803 LOG(WARNING) << "Could not extract public key of certificate."; | 806 LOG(WARNING) << "Could not extract public key of certificate."; |
804 return false; | 807 return false; |
805 } | 808 } |
806 long public_exponent = DER_GetInteger(&public_key->u.rsa.publicExponent); | 809 long public_exponent = DER_GetInteger(&public_key->u.rsa.publicExponent); |
807 if (public_exponent != 65537L) { | 810 if (public_exponent != 65537L) { |
808 LOG(ERROR) << "Rejecting RSA public exponent that is unequal 65537."; | 811 LOG(ERROR) << "Rejecting RSA public exponent that is unequal 65537."; |
809 return false; | 812 return false; |
810 } | 813 } |
811 | 814 |
812 public_key_spki_der->assign(spki_der.data, spki_der.data + spki_der.len); | |
813 *key_type = key_type_tmp; | 815 *key_type = key_type_tmp; |
814 *key_size_bits = key_size_bits_tmp; | 816 *key_size_bits = key_size_bits_tmp; |
815 | |
816 return true; | 817 return true; |
817 } | 818 } |
818 | 819 |
819 void GetCertificates(const std::string& token_id, | 820 void GetCertificates(const std::string& token_id, |
820 const GetCertificatesCallback& callback, | 821 const GetCertificatesCallback& callback, |
821 BrowserContext* browser_context) { | 822 BrowserContext* browser_context) { |
822 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 823 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
823 scoped_ptr<GetCertificatesState> state(new GetCertificatesState(callback)); | 824 scoped_ptr<GetCertificatesState> state(new GetCertificatesState(callback)); |
824 // Get the pointer to |state| before base::Passed releases |state|. | 825 // Get the pointer to |state| before base::Passed releases |state|. |
825 NSSOperationState* state_ptr = state.get(); | 826 NSSOperationState* state_ptr = state.get(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 NSSOperationState* state_ptr = state.get(); | 875 NSSOperationState* state_ptr = state.get(); |
875 GetCertDatabase(std::string() /* don't get any specific slot */, | 876 GetCertDatabase(std::string() /* don't get any specific slot */, |
876 base::Bind(&GetTokensWithDB, base::Passed(&state)), | 877 base::Bind(&GetTokensWithDB, base::Passed(&state)), |
877 browser_context, | 878 browser_context, |
878 state_ptr); | 879 state_ptr); |
879 } | 880 } |
880 | 881 |
881 } // namespace platform_keys | 882 } // namespace platform_keys |
882 | 883 |
883 } // namespace chromeos | 884 } // namespace chromeos |
OLD | NEW |