Skip to content

Commit acafb94

Browse files
committed
Merge branch 'main' into ps/uniffi-passkey-improvements
# Conflicts: # crates/bitwarden-crypto/src/uniffi_support.rs # crates/bitwarden-uniffi/src/uniffi_support.rs # crates/bitwarden/src/platform/fido2/authenticator.rs # crates/bitwarden/src/platform/fido2/client.rs # crates/bitwarden/src/uniffi_support.rs # crates/bitwarden/src/vault/cipher/login.rs
2 parents 2d297b7 + db37b15 commit acafb94

File tree

100 files changed

+1240
-1675
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+1240
-1675
lines changed

.github/renovate.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
33
"extends": ["github>bitwarden/renovate-config:non-pinned"],
44
"separateMajorMinor": true,
5-
"enabledManagers": ["cargo", "dockerfile", "github-actions", "npm", "nuget"],
5+
"enabledManagers": ["cargo", "dockerfile", "github-actions", "gomod", "npm", "nuget"],
6+
"constraints": {
7+
"go": "1.21"
8+
},
69
"packageRules": [
710
{
811
"matchManagers": ["cargo"],
@@ -19,6 +22,11 @@
1922
"groupName": "gh minor",
2023
"matchManagers": ["github-actions"],
2124
"matchUpdateTypes": ["minor", "patch"]
25+
},
26+
{
27+
"groupName": "go minor",
28+
"matchManagers": ["gomod"],
29+
"matchUpdateTypes": ["minor", "patch"]
2230
}
2331
],
2432
"ignoreDeps": ["dotnet-sdk"]

.github/workflows/build-cli.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,10 @@ jobs:
140140
fail-fast: false
141141
matrix:
142142
settings:
143-
- os: macos-12
143+
- os: macos-13
144144
target: x86_64-apple-darwin
145145

146-
- os: macos-12
146+
- os: macos-13
147147
target: aarch64-apple-darwin
148148

149149
steps:
@@ -300,7 +300,7 @@ jobs:
300300

301301
macos-universal-binary:
302302
name: Generate universal macOS binary
303-
runs-on: macos-12
303+
runs-on: macos-13
304304
needs:
305305
- setup
306306
- build-macos

.github/workflows/build-cpp.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
fail-fast: false
2828
matrix:
2929
settings:
30-
- os: macos-12
30+
- os: macos-13
3131
target: x86_64-apple-darwin
3232

3333
# - os: windows-2022

.github/workflows/build-napi.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ jobs:
2727
fail-fast: false
2828
matrix:
2929
settings:
30-
- os: macos-12
30+
- os: macos-13
3131
target: x86_64-apple-darwin
3232
build: |
3333
npm run build
3434
strip -x *.node
3535
36-
- os: macos-12
36+
- os: macos-13
3737
target: aarch64-apple-darwin
3838
build: |
3939
npm run build-arm64

.github/workflows/build-python-wheels.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ jobs:
4646
fail-fast: false
4747
matrix:
4848
settings:
49-
- os: macos-12
49+
- os: macos-13
5050
target: x86_64-apple-darwin
5151

52-
- os: macos-12
52+
- os: macos-13
5353
target: aarch64-apple-darwin
5454

5555
- os: windows-2022

.github/workflows/build-rust-cross-platform.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
settings:
21-
- os: macos-12
21+
- os: macos-13
2222
target: x86_64-apple-darwin
23-
- os: macos-12
23+
- os: macos-13
2424
target: aarch64-apple-darwin
2525
- os: windows-2022
2626
target: x86_64-pc-windows-msvc

.github/workflows/direct-minimal-versions.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ jobs:
2222
fail-fast: false
2323
matrix:
2424
settings:
25-
#- os: macos-12
25+
#- os: macos-13
2626
# target: x86_64-apple-darwin
2727

28-
#- os: macos-12
28+
#- os: macos-13
2929
# target: aarch64-apple-darwin
3030

3131
- os: windows-2022

Cargo.lock

Lines changed: 9 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -89,57 +89,6 @@ strive towards modifying the templates as little as possible to ease future upgr
8989
Note: If you don't have the nightly toolchain installed, the `build-api.sh` script will install it
9090
for you.
9191

92-
## Tests
93-
94-
Many of the SDK tests are based on encrypted data provided by the other Bitwarden clients. In order
95-
to provide a consistent method of retrieving the data we provide a test account with user keys.
96-
97-
**Disclaimer:** The server typically encrypts and protects certain fields. In order to allow
98-
accounts to be used on other servers this protection was explicitly removed from these data dumps.
99-
100-
101-
102-
103-
- Password: `asdfasdfasdf`
104-
- PBKDF2: `600_000` iterations
105-
106-
```sql
107-
INSERT INTO vault_dev.dbo.[User] (
108-
Id, Name, Email, EmailVerified, MasterPassword,
109-
MasterPasswordHint, Culture, SecurityStamp,
110-
TwoFactorProviders, TwoFactorRecoveryCode,
111-
EquivalentDomains, ExcludedGlobalEquivalentDomains,
112-
AccountRevisionDate, [Key], PublicKey,
113-
PrivateKey, Premium, PremiumExpirationDate,
114-
Storage, MaxStorageGb, Gateway, GatewayCustomerId,
115-
GatewaySubscriptionId, LicenseKey,
116-
CreationDate, RevisionDate, RenewalReminderDate,
117-
Kdf, KdfIterations, ReferenceData,
118-
ApiKey, ForcePasswordReset, UsesKeyConnector,
119-
FailedLoginCount, LastFailedLoginDate,
120-
AvatarColor, KdfMemory, KdfParallelism,
121-
LastPasswordChangeDate, LastKdfChangeDate,
122-
LastKeyRotationDate, LastEmailChangeDate
123-
)
124-
VALUES
125-
(
126-
N 'b1fd4bf2-9643-4787-87f3-b0f00189c33b',
127-
N 'Test', N '[email protected]',
128-
0, N 'AQAAAAEAAYagAAAAEJ3ky9F/Zt5sy3/UAHVvBarMR+tBXYOM5IGgXy4/mx82uptgHgItauyCN+UZTvAqiA==',
129-
null, N 'en-US', N 'F3KL7SCJKEXO4LJFVLGZITPEHM7SAVSZ',
130-
null, null, null, null, N '2024-01-07 23:56:48.2600000',
131-
N '2.Q/2PhzcC7GdeiMHhWguYAQ==|GpqzVdr0go0ug5cZh1n+uixeBC3oC90CIe0hd/HWA/pTRDZ8ane4fmsEIcuc8eMKUt55Y2q/fbNzsYu41YTZzzsJUSeqVjT8/iTQtgnNdpo=|dwI+uyvZ1h/iZ03VQ+/wrGEFYVewBUUl/syYgjsNMbE=',
132-
N 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Ww2chogqCpaAR7Uw448am4b7vDFXiM5kXjFlGfXBlrAdAqTTggEvTDlMNYqPlCo+mBM6iFmTTUY9rpZBvFskMnKvsvpJ47/fehAH2o2e3Ulv/5NFevaVCMCmpkBDtbMbO1A4a3btdRtCP8DsKWMefHauEpaoLxNTLWnOIZVfCMjsSgx2EvULHAZPTtbFwm4+UVKniM4ds4jvOsD85h4jn2aLs/jWJXFfxN8iVSqEqpC2TBvsPdyHb49xQoWWfF0Z6BiNqeNGKEU9Uos1pjL+kzhEzzSpH31PZT/ufJ/oo4+93wrUt57hb6f0jxiXhwd5yQ+9F6wVwpbfkq0IwhjOwIDAQAB',
133-
N '2.yN7l00BOlUE0Sb0M//Q53w==|EwKG/BduQRQ33Izqc/ogoBROIoI5dmgrxSo82sgzgAMIBt3A2FZ9vPRMY+GWT85JiqytDitGR3TqwnFUBhKUpRRAq4x7rA6A1arHrFp5Tp1p21O3SfjtvB3quiOKbqWk6ZaU1Np9HwqwAecddFcB0YyBEiRX3VwF2pgpAdiPbSMuvo2qIgyob0CUoC/h4Bz1be7Qa7B0Xw9/fMKkB1LpOm925lzqosyMQM62YpMGkjMsbZz0uPopu32fxzDWSPr+kekNNyLt9InGhTpxLmq1go/pXR2uw5dfpXc5yuta7DB0EGBwnQ8Vl5HPdDooqOTD9I1jE0mRyuBpWTTI3FRnu3JUh3rIyGBJhUmHqGZvw2CKdqHCIrQeQkkEYqOeJRJVdBjhv5KGJifqT3BFRwX/YFJIChAQpebNQKXe/0kPivWokHWwXlDB7S7mBZzhaAPidZvnuIhalE2qmTypDwHy22FyqV58T8MGGMchcASDi/QXI6kcdpJzPXSeU9o+NC68QDlOIrMVxKFeE7w7PvVmAaxEo0YwmuAzzKy9QpdlK0aab/xEi8V4iXj4hGepqAvHkXIQd+r3FNeiLfllkb61p6WTjr5urcmDQMR94/wYoilpG5OlybHdbhsYHvIzYoLrC7fzl630gcO6t4nM24vdB6Ymg9BVpEgKRAxSbE62Tqacxqnz9AcmgItb48NiR/He3n3ydGjPYuKk/ihZMgEwAEZvSlNxYONSbYrIGDtOY+8Nbt6KiH3l06wjZW8tcmFeVlWv+tWotnTY9IqlAfvNVTjtsobqtQnvsiDjdEVtNy/s2ci5TH+NdZluca2OVEr91Wayxh70kpM6ib4UGbfdmGgCo74gtKvKSJU0rTHakQ5L9JlaSDD5FamBRyI0qfL43Ad9qOUZ8DaffDCyuaVyuqk7cz9HwmEmvWU3VQ+5t06n/5kRDXttcw8w+3qClEEdGo1KeENcnXCB32dQe3tDTFpuAIMLqwXs6FhpawfZ5kPYvLPczGWaqftIs/RXJ/EltGc0ugw2dmTLpoQhCqrcKEBDoYVk0LDZKsnzitOGdi9mOWse7Se8798ib1UsHFUjGzISEt6upestxOeupSTOh0v4+AjXbDzRUyogHww3V+Bqg71bkcMxtB+WM+pn1XNbVTyl9NR040nhP7KEf6e9ruXAtmrBC2ah5cFEpLIot77VFZ9ilLuitSz+7T8n1yAh1IEG6xxXxninAZIzi2qGbH69O5RSpOJuJTv17zTLJQIIc781JwQ2TTwTGnx5wZLbffhCasowJKd2EVcyMJyhz6ru0PvXWJ4hUdkARJs3Xu8dus9a86N8Xk6aAPzBDqzYb1vyFIfBxP0oO8xFHgd30Cgmz8UrSE3qeWRrF8ftrI6xQnFjHBGWD/JWSvd6YMcQED0aVuQkuNW9ST/DzQThPzRfPUoiL10yAmV7Ytu4fR3x2sF0Yfi87YhHFuCMpV/DsqxmUizyiJuD938eRcH8hzR/VO53Qo3UIsqOLcyXtTv6THjSlTopQ+JOLOnHm1w8dzYbLN44OG44rRsbihMUQp+wUZ6bsI8rrOnm9WErzkbQFbrfAINdoCiNa6cimYIjvvnMTaFWNymqY1vZxGztQiMiHiHYwTfwHTXrb9j0uPM=|09J28iXv9oWzYtzK2LBT6Yht4IT4MijEkk0fwFdrVQ4=',
134-
0, null, null, null, null, null, null,
135-
null, N '2024-01-07 23:53:38.5900000',
136-
N '2024-01-07 23:53:38.5900000',
137-
null, 0, 600000, N '{"id":null}', N '7gp59kKHt9kMlks0BuNC4IjNXYkljR',
138-
0, 0, 0, null, null, null, null, null,
139-
null, null, null
140-
);
141-
```
142-
14392
## Developer tools
14493

14594
This project recommends the use of certain developer tools, and also includes configurations for

crates/bitwarden-crypto/src/enc_string/asymmetric.rs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use super::{from_b64_vec, split_enc_string};
99
use crate::{
1010
error::{CryptoError, EncStringParseError, Result},
1111
rsa::encrypt_rsa2048_oaep_sha1,
12-
AsymmetricCryptoKey, AsymmetricEncryptable, DecryptedString, DecryptedVec, KeyDecryptable,
13-
SensitiveVec,
12+
AsymmetricCryptoKey, AsymmetricEncryptable, KeyDecryptable,
1413
};
1514

1615
// This module is a workaround to avoid deprecated warnings that come from the ZeroizeOnDrop
@@ -147,10 +146,10 @@ impl serde::Serialize for AsymmetricEncString {
147146
impl AsymmetricEncString {
148147
/// Encrypt and produce a [AsymmetricEncString::Rsa2048_OaepSha1_B64] variant.
149148
pub fn encrypt_rsa2048_oaep_sha1(
150-
data_dec: SensitiveVec,
149+
data_dec: &[u8],
151150
key: &dyn AsymmetricEncryptable,
152151
) -> Result<AsymmetricEncString> {
153-
let enc = encrypt_rsa2048_oaep_sha1(key.to_public_key(), data_dec.expose())?;
152+
let enc = encrypt_rsa2048_oaep_sha1(key.to_public_key(), data_dec)?;
154153
Ok(AsymmetricEncString::Rsa2048_OaepSha1_B64 { data: enc })
155154
}
156155

@@ -167,8 +166,8 @@ impl AsymmetricEncString {
167166
}
168167
}
169168

170-
impl KeyDecryptable<AsymmetricCryptoKey, DecryptedVec> for AsymmetricEncString {
171-
fn decrypt_with_key(&self, key: &AsymmetricCryptoKey) -> Result<DecryptedVec> {
169+
impl KeyDecryptable<AsymmetricCryptoKey, Vec<u8>> for AsymmetricEncString {
170+
fn decrypt_with_key(&self, key: &AsymmetricCryptoKey) -> Result<Vec<u8>> {
172171
use AsymmetricEncString::*;
173172
match self {
174173
Rsa2048_OaepSha256_B64 { data } => key.key.decrypt(Oaep::new::<sha2::Sha256>(), data),
@@ -182,15 +181,14 @@ impl KeyDecryptable<AsymmetricCryptoKey, DecryptedVec> for AsymmetricEncString {
182181
key.key.decrypt(Oaep::new::<sha1::Sha1>(), data)
183182
}
184183
}
185-
.map(|v| DecryptedVec::new(Box::new(v)))
186184
.map_err(|_| CryptoError::KeyDecrypt)
187185
}
188186
}
189187

190-
impl KeyDecryptable<AsymmetricCryptoKey, DecryptedString> for AsymmetricEncString {
191-
fn decrypt_with_key(&self, key: &AsymmetricCryptoKey) -> Result<DecryptedString> {
192-
let dec: DecryptedVec = self.decrypt_with_key(key)?;
193-
dec.try_into()
188+
impl KeyDecryptable<AsymmetricCryptoKey, String> for AsymmetricEncString {
189+
fn decrypt_with_key(&self, key: &AsymmetricCryptoKey) -> Result<String> {
190+
let dec: Vec<u8> = self.decrypt_with_key(key)?;
191+
String::from_utf8(dec).map_err(|_| CryptoError::InvalidUtf8String)
194192
}
195193
}
196194

@@ -211,11 +209,8 @@ mod tests {
211209
use schemars::schema_for;
212210

213211
use super::{AsymmetricCryptoKey, AsymmetricEncString, KeyDecryptable};
214-
use crate::{DecryptedString, SensitiveString};
215212

216-
fn rsa_private_key_string() -> SensitiveString {
217-
SensitiveString::test(
218-
"-----BEGIN PRIVATE KEY-----
213+
const RSA_PRIVATE_KEY: &str = "-----BEGIN PRIVATE KEY-----
219214
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXRVrCX+2hfOQS
220215
8HzYUS2oc/jGVTZpv+/Ryuoh9d8ihYX9dd0cYh2tl6KWdFc88lPUH11Oxqy20Rk2
221216
e5r/RF6T9yM0Me3NPnaKt+hlhLtfoc0h86LnhD56A9FDUfuI0dVnPcrwNv0YJIo9
@@ -242,43 +237,41 @@ AoEZ18y6/KIjpSMpqC92Nnk/EBM9EYe6Cf4eA9ApAoGAeqEUg46UTlJySkBKURGp
242237
Is3v1kkf5I0X8DnOhwb+HPxNaiEdmO7ckm8+tPVgppLcG0+tMdLjigFQiDUQk2y3
243238
WjyxP5ZvXu7U96jaJRI8PFMoE06WeVYcdIzrID2HvqH+w0UQJFrLJ/0Mn4stFAEz
244239
XKZBokBGnjFnTnKcs7nv/O8=
245-
-----END PRIVATE KEY-----",
246-
)
247-
}
240+
-----END PRIVATE KEY-----";
248241

249242
#[test]
250243
fn test_enc_string_rsa2048_oaep_sha256_b64() {
251-
let private_key = AsymmetricCryptoKey::from_pem(rsa_private_key_string()).unwrap();
244+
let private_key = AsymmetricCryptoKey::from_pem(RSA_PRIVATE_KEY).unwrap();
252245
let enc_str: &str = "3.YFqzW9LL/uLjCnl0RRLtndzGJ1FV27mcwQwGjfJPOVrgCX9nJSUYCCDd0iTIyOZ/zRxG47b6L1Z3qgkEfcxjmrSBq60gijc3E2TBMAg7OCLVcjORZ+i1sOVOudmOPWro6uA8refMrg4lqbieDlbLMzjVEwxfi5WpcL876cD0vYyRwvLO3bzFrsE7x33HHHtZeOPW79RqMn5efsB5Dj9wVheC9Ix9AYDjbo+rjg9qR6guwKmS7k2MSaIQlrDR7yu8LP+ePtiSjx+gszJV5jQGfcx60dtiLQzLS/mUD+RmU7B950Bpx0H7x56lT5yXZbWK5YkoP6qd8B8D2aKbP68Ywg==";
253246
let enc_string: AsymmetricEncString = enc_str.parse().unwrap();
254247

255248
assert_eq!(enc_string.enc_type(), 3);
256249

257-
let res: DecryptedString = enc_string.decrypt_with_key(&private_key).unwrap();
250+
let res: String = enc_string.decrypt_with_key(&private_key).unwrap();
258251
assert_eq!(res, "EncryptMe!");
259252
}
260253

261254
#[test]
262255
fn test_enc_string_rsa2048_oaep_sha1_b64() {
263-
let private_key = AsymmetricCryptoKey::from_pem(rsa_private_key_string()).unwrap();
256+
let private_key = AsymmetricCryptoKey::from_pem(RSA_PRIVATE_KEY).unwrap();
264257
let enc_str: &str = "4.ZheRb3PCfAunyFdQYPfyrFqpuvmln9H9w5nDjt88i5A7ug1XE0LJdQHCIYJl0YOZ1gCOGkhFu/CRY2StiLmT3iRKrrVBbC1+qRMjNNyDvRcFi91LWsmRXhONVSPjywzrJJXglsztDqGkLO93dKXNhuKpcmtBLsvgkphk/aFvxbaOvJ/FHdK/iV0dMGNhc/9tbys8laTdwBlI5xIChpRcrfH+XpSFM88+Bu03uK67N9G6eU1UmET+pISJwJvMuIDMqH+qkT7OOzgL3t6I0H2LDj+CnsumnQmDsvQzDiNfTR0IgjpoE9YH2LvPXVP2wVUkiTwXD9cG/E7XeoiduHyHjw==";
265258
let enc_string: AsymmetricEncString = enc_str.parse().unwrap();
266259

267260
assert_eq!(enc_string.enc_type(), 4);
268261

269-
let res: DecryptedString = enc_string.decrypt_with_key(&private_key).unwrap();
262+
let res: String = enc_string.decrypt_with_key(&private_key).unwrap();
270263
assert_eq!(res, "EncryptMe!");
271264
}
272265

273266
#[test]
274267
fn test_enc_string_rsa2048_oaep_sha1_hmac_sha256_b64() {
275-
let private_key = AsymmetricCryptoKey::from_pem(rsa_private_key_string()).unwrap();
268+
let private_key = AsymmetricCryptoKey::from_pem(RSA_PRIVATE_KEY).unwrap();
276269
let enc_str: &str = "6.ThnNc67nNr7GELyuhGGfsXNP2zJnNqhrIsjntEQ27r2qmn8vwdHbTbfO0cwt6YgSibDN0PjiCZ1O3Wb/IFq+vwvyRwFqF9145wBF8CQCbkhV+M0XvO99kh0daovtt120Nve/5ETI5PbPag9VdalKRQWZypJaqQHm5TAQVf4F5wtLlCLMBkzqTk+wkFe7BPMTGn07T+O3eJbTxXvyMZewQ7icJF0MZVA7VyWX9qElmZ89FCKowbf1BMr5pbcQ+0KdXcSVW3to43VkTp7k7COwsuH3M/i1AuVP5YN8ixjyRpvaeGqX/ap2nCHK2Wj5VxgCGT7XEls6ZknnAp9nB9qVjQ==|s3ntw5H/KKD/qsS0lUghTHl5Sm9j6m7YEdNHf0OeAFQ=";
277270
let enc_string: AsymmetricEncString = enc_str.parse().unwrap();
278271

279272
assert_eq!(enc_string.enc_type(), 6);
280273

281-
let res: DecryptedString = enc_string.decrypt_with_key(&private_key).unwrap();
274+
let res: String = enc_string.decrypt_with_key(&private_key).unwrap();
282275
assert_eq!(res, "EncryptMe!");
283276
}
284277

0 commit comments

Comments
 (0)