Skip to content

Commit 25db3a0

Browse files
Refactor RsaSsaPkcsPrivateKey and RsaSsaPkcsPublicKey Class (#170)
1 parent b9ad66e commit 25db3a0

11 files changed

+312
-87
lines changed

lib/src/impl_ffi/impl_ffi.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,10 @@ final class _WebCryptoImpl implements WebCryptoImpl {
104104

105105
@override
106106
final rsaPssPublicKey = const _StaticRsaPssPublicKeyImpl();
107+
108+
@override
109+
final rsaSsaPkcs1v15PrivateKey = const _StaticRsaSsaPkcs1V15PrivateKeyImpl();
110+
111+
@override
112+
final rsaSsaPkcs1v15PublicKey = const _StaticRsaSsaPkcs1V15PublicKeyImpl();
107113
}

lib/src/impl_ffi/impl_ffi.rsassapkcs1v15.dart

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,22 @@ String _rsassaPkcs1V15JwkAlgFromHash(_Hash hash) {
3333
throw UnsupportedError('hash is not supported');
3434
}
3535

36-
Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importPkcs8Key(
36+
Future<RsaSsaPkcs1V15PrivateKeyImpl> rsassaPkcs1V15PrivateKey_importPkcs8Key(
3737
List<int> keyData,
3838
Hash hash,
3939
) async {
4040
// Get hash first, to avoid a leak of EVP_PKEY if _Hash.fromHash throws
4141
final h = _Hash.fromHash(hash);
42-
return _RsassaPkcs1V15PrivateKey(_importPkcs8RsaPrivateKey(keyData), h);
42+
return _RsaSsaPkcs1V15PrivateKeyImpl(_importPkcs8RsaPrivateKey(keyData), h);
4343
}
4444

45-
Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importJsonWebKey(
45+
Future<RsaSsaPkcs1V15PrivateKeyImpl> rsassaPkcs1V15PrivateKey_importJsonWebKey(
4646
Map<String, dynamic> jwk,
4747
Hash hash,
4848
) async {
4949
// Get hash first, to avoid a leak of EVP_PKEY if _Hash.fromHash throws
5050
final h = _Hash.fromHash(hash);
51-
return _RsassaPkcs1V15PrivateKey(
51+
return _RsaSsaPkcs1V15PrivateKeyImpl(
5252
_importJwkRsaPrivateOrPublicKey(
5353
JsonWebKey.fromJson(jwk),
5454
isPrivateKey: true,
@@ -59,7 +59,7 @@ Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importJsonWebKey(
5959
);
6060
}
6161

62-
Future<KeyPair<RsassaPkcs1V15PrivateKey, RsassaPkcs1V15PublicKey>>
62+
Future<KeyPair<RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl>>
6363
rsassaPkcs1V15PrivateKey_generateKey(
6464
int modulusLength,
6565
BigInt publicExponent,
@@ -69,27 +69,27 @@ Future<KeyPair<RsassaPkcs1V15PrivateKey, RsassaPkcs1V15PublicKey>>
6969
final h = _Hash.fromHash(hash);
7070
final keys = _generateRsaKeyPair(modulusLength, publicExponent);
7171
return createKeyPair(
72-
_RsassaPkcs1V15PrivateKey(keys.privateKey, h),
73-
_RsassaPkcs1V15PublicKey(keys.publicKey, h),
72+
_RsaSsaPkcs1V15PrivateKeyImpl(keys.privateKey, h),
73+
_RsaSsaPkcs1V15PublicKeyImpl(keys.publicKey, h),
7474
);
7575
}
7676

77-
Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importSpkiKey(
77+
Future<RsaSsaPkcs1V15PublicKeyImpl> rsassaPkcs1V15PublicKey_importSpkiKey(
7878
List<int> keyData,
7979
Hash hash,
8080
) async {
8181
// Get hash first, to avoid a leak of EVP_PKEY if _Hash.fromHash throws
8282
final h = _Hash.fromHash(hash);
83-
return _RsassaPkcs1V15PublicKey(_importSpkiRsaPublicKey(keyData), h);
83+
return _RsaSsaPkcs1V15PublicKeyImpl(_importSpkiRsaPublicKey(keyData), h);
8484
}
8585

86-
Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importJsonWebKey(
86+
Future<RsaSsaPkcs1V15PublicKeyImpl> rsassaPkcs1V15PublicKey_importJsonWebKey(
8787
Map<String, dynamic> jwk,
8888
Hash hash,
8989
) async {
9090
// Get hash first, to avoid a leak of EVP_PKEY if _Hash.fromHash throws
9191
final h = _Hash.fromHash(hash);
92-
return _RsassaPkcs1V15PublicKey(
92+
return _RsaSsaPkcs1V15PublicKeyImpl(
9393
_importJwkRsaPrivateOrPublicKey(
9494
JsonWebKey.fromJson(jwk),
9595
isPrivateKey: false,
@@ -100,11 +100,45 @@ Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importJsonWebKey(
100100
);
101101
}
102102

103-
class _RsassaPkcs1V15PrivateKey implements RsassaPkcs1V15PrivateKey {
103+
final class _StaticRsaSsaPkcs1V15PrivateKeyImpl
104+
implements StaticRsaSsaPkcs1v15PrivateKeyImpl {
105+
const _StaticRsaSsaPkcs1V15PrivateKeyImpl();
106+
107+
@override
108+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importPkcs8Key(
109+
List<int> keyData,
110+
Hash hash,
111+
) =>
112+
rsassaPkcs1V15PrivateKey_importPkcs8Key(keyData, hash);
113+
114+
@override
115+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importJsonWebKey(
116+
Map<String, dynamic> jwk,
117+
Hash hash,
118+
) =>
119+
rsassaPkcs1V15PrivateKey_importJsonWebKey(jwk, hash);
120+
121+
@override
122+
Future<(RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl)>
123+
generateKey(
124+
int modulusLength,
125+
BigInt publicExponent,
126+
Hash hash,
127+
) async {
128+
final KeyPair<RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl>
129+
pair = await rsassaPkcs1V15PrivateKey_generateKey(
130+
modulusLength, publicExponent, hash);
131+
132+
return (pair.privateKey, pair.publicKey);
133+
}
134+
}
135+
136+
final class _RsaSsaPkcs1V15PrivateKeyImpl
137+
implements RsaSsaPkcs1V15PrivateKeyImpl {
104138
final _EvpPKey _key;
105139
final _Hash _hash;
106140

107-
_RsassaPkcs1V15PrivateKey(this._key, this._hash);
141+
_RsaSsaPkcs1V15PrivateKeyImpl(this._key, this._hash);
108142

109143
@override
110144
String toString() {
@@ -133,11 +167,27 @@ class _RsassaPkcs1V15PrivateKey implements RsassaPkcs1V15PrivateKey {
133167
Future<Uint8List> exportPkcs8Key() async => _exportPkcs8Key(_key);
134168
}
135169

136-
class _RsassaPkcs1V15PublicKey implements RsassaPkcs1V15PublicKey {
170+
final class _StaticRsaSsaPkcs1V15PublicKeyImpl
171+
implements StaticRsaSsaPkcs1v15PublicKeyImpl {
172+
const _StaticRsaSsaPkcs1V15PublicKeyImpl();
173+
174+
@override
175+
Future<RsaSsaPkcs1V15PublicKeyImpl> importSpkiKey(
176+
List<int> keyData, Hash hash) =>
177+
rsassaPkcs1V15PublicKey_importSpkiKey(keyData, hash);
178+
179+
@override
180+
Future<RsaSsaPkcs1V15PublicKeyImpl> importJsonWebKey(
181+
Map<String, dynamic> jwk, Hash hash) =>
182+
rsassaPkcs1V15PublicKey_importJsonWebKey(jwk, hash);
183+
}
184+
185+
final class _RsaSsaPkcs1V15PublicKeyImpl
186+
implements RsaSsaPkcs1V15PublicKeyImpl {
137187
final _EvpPKey _key;
138188
final _Hash _hash;
139189

140-
_RsassaPkcs1V15PublicKey(this._key, this._hash);
190+
_RsaSsaPkcs1V15PublicKeyImpl(this._key, this._hash);
141191

142192
@override
143193
Future<bool> verifyBytes(List<int> signature, List<int> data) =>

lib/src/impl_interface/impl_interface.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ part 'impl_interface.ecdsa.dart';
2929
part 'impl_interface.rsaoaep.dart';
3030
part 'impl_interface.hkdf.dart';
3131
part 'impl_interface.rsapss.dart';
32+
part 'impl_interface.rsassapkcs1v15.dart';
3233

3334
/// A key-pair as returned from key generation.
3435
class KeyPair<S, T> {
@@ -93,4 +94,6 @@ abstract interface class WebCryptoImpl {
9394
StaticHkdfSecretKeyImpl get hkdfSecretKey;
9495
StaticRsaPssPrivateKeyImpl get rsaPssPrivateKey;
9596
StaticRsaPssPublicKeyImpl get rsaPssPublicKey;
97+
StaticRsaSsaPkcs1v15PrivateKeyImpl get rsaSsaPkcs1v15PrivateKey;
98+
StaticRsaSsaPkcs1v15PublicKeyImpl get rsaSsaPkcs1v15PublicKey;
9699
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2020 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
part of 'impl_interface.dart';
16+
17+
abstract interface class StaticRsaSsaPkcs1v15PrivateKeyImpl {
18+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importPkcs8Key(
19+
List<int> keyData, Hash hash);
20+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importJsonWebKey(
21+
Map<String, dynamic> jwk, Hash hash);
22+
Future<(RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl)>
23+
generateKey(int modulusLength, BigInt publicExponent, Hash hash);
24+
}
25+
26+
abstract interface class RsaSsaPkcs1V15PrivateKeyImpl {
27+
Future<Uint8List> signBytes(List<int> data);
28+
Future<Uint8List> signStream(Stream<List<int>> data);
29+
Future<Uint8List> exportPkcs8Key();
30+
Future<Map<String, dynamic>> exportJsonWebKey();
31+
}
32+
33+
abstract interface class StaticRsaSsaPkcs1v15PublicKeyImpl {
34+
Future<RsaSsaPkcs1V15PublicKeyImpl> importSpkiKey(
35+
List<int> keyData, Hash hash);
36+
Future<RsaSsaPkcs1V15PublicKeyImpl> importJsonWebKey(
37+
Map<String, dynamic> jwk, Hash hash);
38+
}
39+
40+
abstract interface class RsaSsaPkcs1V15PublicKeyImpl {
41+
Future<bool> verifyBytes(List<int> signature, List<int> data);
42+
Future<bool> verifyStream(List<int> signature, Stream<List<int>> data);
43+
Future<Uint8List> exportSpkiKey();
44+
Future<Map<String, dynamic>> exportJsonWebKey();
45+
}

lib/src/impl_js/impl_js.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,10 @@ final class _WebCryptoImpl implements WebCryptoImpl {
9191

9292
@override
9393
final rsaPssPublicKey = const _StaticRsaPssPublicKeyImpl();
94+
95+
@override
96+
final rsaSsaPkcs1v15PrivateKey = const _StaticRsaSsaPkcs1V15PrivateKeyImpl();
97+
98+
@override
99+
final rsaSsaPkcs1v15PublicKey = const _StaticRsaSsaPkcs1V15PublicKeyImpl();
94100
}

lib/src/impl_js/impl_js.rsassapkcs1v15.dart

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ part of 'impl_js.dart';
1818

1919
const _rsassaPkcs1V15Algorithm = subtle.Algorithm(name: 'RSASSA-PKCS1-v1_5');
2020

21-
Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importPkcs8Key(
21+
Future<RsaSsaPkcs1V15PrivateKeyImpl> rsassaPkcs1V15PrivateKey_importPkcs8Key(
2222
List<int> keyData,
2323
Hash hash,
2424
) async {
25-
return _RsassaPkcs1V15PrivateKey(await _importKey(
25+
return _RsaSsaPkcs1V15PrivateKeyImpl(await _importKey(
2626
'pkcs8',
2727
keyData,
2828
_rsassaPkcs1V15Algorithm.update(hash: _getHashAlgorithm(hash)),
@@ -31,19 +31,19 @@ Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importPkcs8Key(
3131
));
3232
}
3333

34-
Future<RsassaPkcs1V15PrivateKey> rsassaPkcs1V15PrivateKey_importJsonWebKey(
34+
Future<RsaSsaPkcs1V15PrivateKeyImpl> rsassaPkcs1V15PrivateKey_importJsonWebKey(
3535
Map<String, dynamic> jwk,
3636
Hash hash,
3737
) async {
38-
return _RsassaPkcs1V15PrivateKey(await _importJsonWebKey(
38+
return _RsaSsaPkcs1V15PrivateKeyImpl(await _importJsonWebKey(
3939
jwk,
4040
_rsassaPkcs1V15Algorithm.update(hash: _getHashAlgorithm(hash)),
4141
_usagesSign,
4242
'private',
4343
));
4444
}
4545

46-
Future<KeyPair<RsassaPkcs1V15PrivateKey, RsassaPkcs1V15PublicKey>>
46+
Future<KeyPair<RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl>>
4747
rsassaPkcs1V15PrivateKey_generateKey(
4848
int modulusLength,
4949
BigInt publicExponent,
@@ -58,16 +58,16 @@ Future<KeyPair<RsassaPkcs1V15PrivateKey, RsassaPkcs1V15PublicKey>>
5858
_usagesSignVerify,
5959
);
6060
return createKeyPair(
61-
_RsassaPkcs1V15PrivateKey(pair.privateKey),
62-
_RsassaPkcs1V15PublicKey(pair.publicKey),
61+
_RsaSsaPkcs1V15PrivateKeyImpl(pair.privateKey),
62+
_RsaSsaPkcs1V15PublicKeyImpl(pair.publicKey),
6363
);
6464
}
6565

66-
Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importSpkiKey(
66+
Future<RsaSsaPkcs1V15PublicKeyImpl> rsassaPkcs1V15PublicKey_importSpkiKey(
6767
List<int> keyData,
6868
Hash hash,
6969
) async {
70-
return _RsassaPkcs1V15PublicKey(await _importKey(
70+
return _RsaSsaPkcs1V15PublicKeyImpl(await _importKey(
7171
'spki',
7272
keyData,
7373
_rsassaPkcs1V15Algorithm.update(hash: _getHashAlgorithm(hash)),
@@ -76,21 +76,49 @@ Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importSpkiKey(
7676
));
7777
}
7878

79-
Future<RsassaPkcs1V15PublicKey> rsassaPkcs1V15PublicKey_importJsonWebKey(
79+
Future<RsaSsaPkcs1V15PublicKeyImpl> rsassaPkcs1V15PublicKey_importJsonWebKey(
8080
Map<String, dynamic> jwk,
8181
Hash hash,
8282
) async {
83-
return _RsassaPkcs1V15PublicKey(await _importJsonWebKey(
83+
return _RsaSsaPkcs1V15PublicKeyImpl(await _importJsonWebKey(
8484
jwk,
8585
_rsassaPkcs1V15Algorithm.update(hash: _getHashAlgorithm(hash)),
8686
_usagesVerify,
8787
'public',
8888
));
8989
}
9090

91-
class _RsassaPkcs1V15PrivateKey implements RsassaPkcs1V15PrivateKey {
91+
final class _StaticRsaSsaPkcs1V15PrivateKeyImpl
92+
implements StaticRsaSsaPkcs1v15PrivateKeyImpl {
93+
const _StaticRsaSsaPkcs1V15PrivateKeyImpl();
94+
95+
@override
96+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importPkcs8Key(
97+
List<int> keyData, Hash hash) async {
98+
return await rsassaPkcs1V15PrivateKey_importPkcs8Key(keyData, hash);
99+
}
100+
101+
@override
102+
Future<RsaSsaPkcs1V15PrivateKeyImpl> importJsonWebKey(
103+
Map<String, dynamic> jwk, Hash hash) async {
104+
return await rsassaPkcs1V15PrivateKey_importJsonWebKey(jwk, hash);
105+
}
106+
107+
@override
108+
Future<(RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl)>
109+
generateKey(int modulusLength, BigInt publicExponent, Hash hash) async {
110+
final KeyPair<RsaSsaPkcs1V15PrivateKeyImpl, RsaSsaPkcs1V15PublicKeyImpl>
111+
pair = await rsassaPkcs1V15PrivateKey_generateKey(
112+
modulusLength, publicExponent, hash);
113+
114+
return (pair.privateKey, pair.publicKey);
115+
}
116+
}
117+
118+
final class _RsaSsaPkcs1V15PrivateKeyImpl
119+
implements RsaSsaPkcs1V15PrivateKeyImpl {
92120
final subtle.JSCryptoKey _key;
93-
_RsassaPkcs1V15PrivateKey(this._key);
121+
_RsaSsaPkcs1V15PrivateKeyImpl(this._key);
94122

95123
@override
96124
Future<Uint8List> signBytes(List<int> data) async {
@@ -113,13 +141,31 @@ class _RsassaPkcs1V15PrivateKey implements RsassaPkcs1V15PrivateKey {
113141
}
114142
}
115143

116-
class _RsassaPkcs1V15PublicKey implements RsassaPkcs1V15PublicKey {
144+
final class _StaticRsaSsaPkcs1V15PublicKeyImpl
145+
implements StaticRsaSsaPkcs1v15PublicKeyImpl {
146+
const _StaticRsaSsaPkcs1V15PublicKeyImpl();
147+
148+
@override
149+
Future<RsaSsaPkcs1V15PublicKeyImpl> importSpkiKey(
150+
List<int> keyData, Hash hash) async {
151+
return await rsassaPkcs1V15PublicKey_importSpkiKey(keyData, hash);
152+
}
153+
154+
@override
155+
Future<RsaSsaPkcs1V15PublicKeyImpl> importJsonWebKey(
156+
Map<String, dynamic> jwk, Hash hash) async {
157+
return await rsassaPkcs1V15PublicKey_importJsonWebKey(jwk, hash);
158+
}
159+
}
160+
161+
final class _RsaSsaPkcs1V15PublicKeyImpl
162+
implements RsaSsaPkcs1V15PublicKeyImpl {
117163
final subtle.JSCryptoKey _key;
118-
_RsassaPkcs1V15PublicKey(this._key);
164+
_RsaSsaPkcs1V15PublicKeyImpl(this._key);
119165

120166
@override
121167
String toString() {
122-
return 'Instance of \'RsassaPkcs1V15PublicKey\'';
168+
return 'Instance of \'RsaSsaPkcs1V15PublicKeyImpl\'';
123169
}
124170

125171
@override

0 commit comments

Comments
 (0)