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

Side by Side Diff: username_passkey.cc

Issue 2645008: Update on feedback, update dbus API, add unit tests. TEST=manual,unit,BVT BUG=3628 323 (Closed) Base URL: ssh://git@chromiumos-git/cryptohome.git
Patch Set: Address second round of feedback. Created 10 years, 6 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
« no previous file with comments | « username_passkey.h ('k') | username_passkey_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2009-2010 The Chromium OS 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 "cryptohome/username_passkey.h" 5 #include "username_passkey.h"
6 6
7 #include <openssl/sha.h> 7 #include <openssl/sha.h>
8 8
9 #include "base/logging.h" 9 #include <base/logging.h>
10 #include "chromeos/utility.h" 10 #include <chromeos/utility.h>
11
12 #include "crypto.h"
11 13
12 namespace cryptohome { 14 namespace cryptohome {
13 using std::string; 15 using std::string;
14 16
15 UsernamePasskey::UsernamePasskey(const char *username, 17 UsernamePasskey::UsernamePasskey(const char *username,
16 const int username_length, 18 const chromeos::Blob& passkey)
17 const char *passkey, 19 : username_(username, strlen(username)),
18 const int passkey_length)
19 : username_(username, username_length),
20 passkey_(passkey_length) {
21 memcpy(&passkey_[0], passkey, passkey_length);
22 }
23
24 UsernamePasskey::UsernamePasskey(const char *username,
25 const int username_length,
26 const chromeos::Blob& passkey)
27 : username_(username, username_length),
28 passkey_() { 20 passkey_() {
29 passkey_.assign(passkey.begin(), passkey.end()); 21 passkey_.assign(passkey.begin(), passkey.end());
30 } 22 }
31 23
32 UsernamePasskey::UsernamePasskey(const char *username,
33 const int username_length,
34 const std::string& passkey)
35 : username_(username, username_length),
36 passkey_() {
37 passkey_.resize(passkey.length());
38 memcpy(&passkey_[0], passkey.c_str(), passkey.length());
39 }
40
41 UsernamePasskey::UsernamePasskey(const UsernamePasskey& rhs)
42 : username_(rhs.username_),
43 passkey_(rhs.passkey_) {
44 }
45
46 UsernamePasskey::~UsernamePasskey() { 24 UsernamePasskey::~UsernamePasskey() {
47 } 25 }
48 26
49 UsernamePasskey& UsernamePasskey::operator=(const UsernamePasskey& rhs) {
50 this->username_ = rhs.username_;
51 this->passkey_ = rhs.passkey_;
52 return *this;
53 }
54
55 UsernamePasskey UsernamePasskey::FromUsernamePassword(const char* username,
56 const char* password,
57 const chromeos::Blob& salt) {
58 SecureBlob passkey = PasswordToPasskey(password, salt);
59 return UsernamePasskey(username, strlen(username), passkey);
60 }
61
62 SecureBlob UsernamePasskey::PasswordToPasskey(const char *password,
63 const chromeos::Blob& salt) {
64 CHECK(password);
65
66 std::string ascii_salt = chromeos::AsciiEncode(salt);
67 // Convert a raw password to a password hash
68 SHA256_CTX sha_ctx;
69 unsigned char md_value[SHA256_DIGEST_LENGTH];
70
71 SHA256_Init(&sha_ctx);
72 SHA256_Update(&sha_ctx,
73 reinterpret_cast<const unsigned char*>(ascii_salt.data()),
74 static_cast<unsigned int>(ascii_salt.length()));
75 SHA256_Update(&sha_ctx, password, strlen(password));
76 SHA256_Final(md_value, &sha_ctx);
77
78 SecureBlob password_hash(SHA256_DIGEST_LENGTH);
79 AsciiEncodeToBuffer(md_value, SHA256_DIGEST_LENGTH / 2,
80 reinterpret_cast<char*>(&password_hash[0]),
81 password_hash.size());
82 chromeos::SecureMemset(md_value, sizeof(md_value), 0);
83 return password_hash;
84 }
85
86 void UsernamePasskey::AsciiEncodeToBuffer(const unsigned char* source,
87 int source_length, char* buffer,
88 int buffer_length) {
89 const char hex_chars[] = "0123456789abcdef";
90 int i = 0;
91 for (int index = 0;
92 (index < source_length) && ((i + 1) < buffer_length);
93 index++) {
94 buffer[i++] = hex_chars[(source[index] >> 4) & 0x0f];
95 buffer[i++] = hex_chars[source[index] & 0x0f];
96 }
97 if (i < buffer_length) {
98 buffer[i] = '\0';
99 }
100 }
101
102 void UsernamePasskey::GetFullUsername(char *name_buffer, int length) const { 27 void UsernamePasskey::GetFullUsername(char *name_buffer, int length) const {
103 strncpy(name_buffer, username_.c_str(), length); 28 strncpy(name_buffer, username_.c_str(), length);
104 } 29 }
105 30
106 std::string UsernamePasskey::GetFullUsername() const { 31 std::string UsernamePasskey::GetFullUsernameString() const {
107 return username_; 32 return username_;
108 } 33 }
109 34
110 void UsernamePasskey::GetPartialUsername(char *name_buffer, int length) const { 35 void UsernamePasskey::GetPartialUsername(char *name_buffer, int length) const {
111 size_t at_index = username_.find('@'); 36 size_t at_index = username_.find('@');
112 string partial = username_.substr(0, at_index); 37 string partial = username_.substr(0, at_index);
113 strncpy(name_buffer, partial.c_str(), length); 38 strncpy(name_buffer, partial.c_str(), length);
114 } 39 }
115 40
116 string UsernamePasskey::GetObfuscatedUsername( 41 string UsernamePasskey::GetObfuscatedUsername(
117 const chromeos::Blob &system_salt) const { 42 const chromeos::Blob &system_salt) const {
118 CHECK(!username_.empty()); 43 CHECK(!username_.empty());
119 44
120 SHA_CTX ctx; 45 SHA_CTX ctx;
121 unsigned char md_value[SHA_DIGEST_LENGTH]; 46 unsigned char md_value[SHA_DIGEST_LENGTH];
122 47
123 SHA1_Init(&ctx); 48 SHA1_Init(&ctx);
124 SHA1_Update(&ctx, &system_salt[0], system_salt.size()); 49 SHA1_Update(&ctx, &system_salt[0], system_salt.size());
125 SHA1_Update(&ctx, username_.c_str(), username_.length()); 50 SHA1_Update(&ctx, username_.c_str(), username_.length());
126 SHA1_Final(md_value, &ctx); 51 SHA1_Final(md_value, &ctx);
127 52
128 chromeos::Blob md_blob(md_value, 53 chromeos::Blob md_blob(md_value,
129 md_value + (SHA_DIGEST_LENGTH * sizeof(unsigned char))); 54 md_value + (SHA_DIGEST_LENGTH * sizeof(unsigned char)));
130 55
131 return chromeos::AsciiEncode(md_blob); 56 return chromeos::AsciiEncode(md_blob);
132 } 57 }
133 58
134 SecureBlob UsernamePasskey::GetPasskey() const { 59 void UsernamePasskey::GetPasskey(SecureBlob* passkey) const {
135 return passkey_; 60 *passkey = passkey_;
136 } 61 }
137 62
138 } // namespace cryptohome 63 } // namespace cryptohome
OLDNEW
« no previous file with comments | « username_passkey.h ('k') | username_passkey_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698