Skip to content

Commit 8ac145b

Browse files
Refactor EcdsaPublicKey and EcdsaPrivateKey Class (#162)
* refactor: update ecdsa-public-key ecdsa-private-key * style: format dart code * fix: resolve dart:ui failed tests
1 parent 0a4a542 commit 8ac145b

File tree

10 files changed

+331
-100
lines changed

10 files changed

+331
-100
lines changed

lib/src/impl_ffi/impl_ffi.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ final class _WebCryptoImpl implements WebCryptoImpl {
8484
@override
8585
final ecdhPublicKey = const _StaticEcdhPublicKeyImpl();
8686

87+
@override
88+
final ecdsaPrivateKey = const _StaticEcdsaPrivateKeyImpl();
89+
90+
@override
91+
final ecdsaPublicKey = const _StaticEcdsaPublicKeyImpl();
92+
8793
@override
8894
final rsaOaepPrivateKey = const _StaticRsaOaepPrivateKeyImpl();
8995

lib/src/impl_ffi/impl_ffi.ecdsa.dart

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,51 +32,52 @@ String _ecdsaCurveToJwkAlg(EllipticCurve curve) {
3232
throw UnsupportedError('curve "$curve" is not supported');
3333
}
3434

35-
Future<EcdsaPrivateKey> ecdsaPrivateKey_importPkcs8Key(
35+
Future<EcdsaPrivateKeyImpl> ecdsaPrivateKey_importPkcs8Key(
3636
List<int> keyData,
3737
EllipticCurve curve,
3838
) async =>
39-
_EcdsaPrivateKey(_importPkcs8EcPrivateKey(keyData, curve));
39+
_EcdsaPrivateKeyImpl(_importPkcs8EcPrivateKey(keyData, curve));
4040

41-
Future<EcdsaPrivateKey> ecdsaPrivateKey_importJsonWebKey(
41+
Future<EcdsaPrivateKeyImpl> ecdsaPrivateKey_importJsonWebKey(
4242
Map<String, dynamic> jwk,
4343
EllipticCurve curve,
4444
) async =>
45-
_EcdsaPrivateKey(_importJwkEcPrivateOrPublicKey(
45+
_EcdsaPrivateKeyImpl(_importJwkEcPrivateOrPublicKey(
4646
JsonWebKey.fromJson(jwk),
4747
curve,
4848
isPrivateKey: true,
4949
expectedUse: 'sig',
5050
expectedAlg: _ecdsaCurveToJwkAlg(curve),
5151
));
5252

53-
Future<KeyPair<EcdsaPrivateKey, EcdsaPublicKey>> ecdsaPrivateKey_generateKey(
53+
Future<KeyPair<EcdsaPrivateKeyImpl, EcdsaPublicKeyImpl>>
54+
ecdsaPrivateKey_generateKey(
5455
EllipticCurve curve,
5556
) async {
5657
final p = _generateEcKeyPair(curve);
5758
return createKeyPair(
58-
_EcdsaPrivateKey(p.privateKey),
59-
_EcdsaPublicKey(p.publicKey),
59+
_EcdsaPrivateKeyImpl(p.privateKey),
60+
_EcdsaPublicKeyImpl(p.publicKey),
6061
);
6162
}
6263

63-
Future<EcdsaPublicKey> ecdsaPublicKey_importRawKey(
64+
Future<EcdsaPublicKeyImpl> ecdsaPublicKey_importRawKey(
6465
List<int> keyData,
6566
EllipticCurve curve,
6667
) async =>
67-
_EcdsaPublicKey(_importRawEcPublicKey(keyData, curve));
68+
_EcdsaPublicKeyImpl(_importRawEcPublicKey(keyData, curve));
6869

69-
Future<EcdsaPublicKey> ecdsaPublicKey_importSpkiKey(
70+
Future<EcdsaPublicKeyImpl> ecdsaPublicKey_importSpkiKey(
7071
List<int> keyData,
7172
EllipticCurve curve,
7273
) async =>
73-
_EcdsaPublicKey(_importSpkiEcPublicKey(keyData, curve));
74+
_EcdsaPublicKeyImpl(_importSpkiEcPublicKey(keyData, curve));
7475

75-
Future<EcdsaPublicKey> ecdsaPublicKey_importJsonWebKey(
76+
Future<EcdsaPublicKeyImpl> ecdsaPublicKey_importJsonWebKey(
7677
Map<String, dynamic> jwk,
7778
EllipticCurve curve,
7879
) async =>
79-
_EcdsaPublicKey(_importJwkEcPrivateOrPublicKey(
80+
_EcdsaPublicKeyImpl(_importJwkEcPrivateOrPublicKey(
8081
JsonWebKey.fromJson(jwk),
8182
curve,
8283
isPrivateKey: false,
@@ -180,14 +181,40 @@ Uint8List? _convertEcdsaWebCryptoSignatureToDerSignature(
180181
});
181182
}
182183

183-
class _EcdsaPrivateKey implements EcdsaPrivateKey {
184+
final class _StaticEcdsaPrivateKeyImpl implements StaticEcdsaPrivateKeyImpl {
185+
const _StaticEcdsaPrivateKeyImpl();
186+
187+
@override
188+
Future<EcdsaPrivateKeyImpl> importPkcs8Key(
189+
List<int> keyData, EllipticCurve curve) =>
190+
ecdsaPrivateKey_importPkcs8Key(keyData, curve);
191+
192+
@override
193+
Future<EcdsaPrivateKeyImpl> importJsonWebKey(
194+
Map<String, dynamic> jwk,
195+
EllipticCurve curve,
196+
) =>
197+
ecdsaPrivateKey_importJsonWebKey(jwk, curve);
198+
199+
@override
200+
Future<(EcdsaPrivateKeyImpl, EcdsaPublicKeyImpl)> generateKey(
201+
EllipticCurve curve,
202+
) async {
203+
final KeyPair<EcdsaPrivateKeyImpl, EcdsaPublicKeyImpl> keyPair =
204+
await ecdsaPrivateKey_generateKey(curve);
205+
206+
return (keyPair.privateKey, keyPair.publicKey);
207+
}
208+
}
209+
210+
final class _EcdsaPrivateKeyImpl implements EcdsaPrivateKeyImpl {
184211
final _EvpPKey _key;
185212

186-
_EcdsaPrivateKey(this._key);
213+
_EcdsaPrivateKeyImpl(this._key);
187214

188215
@override
189216
String toString() {
190-
return 'Instance of \'EcdsaPrivateKey\'';
217+
return 'Instance of \'EcdsaPrivateKeyImpl\'';
191218
}
192219

193220
@override
@@ -209,14 +236,35 @@ class _EcdsaPrivateKey implements EcdsaPrivateKey {
209236
Future<Uint8List> exportPkcs8Key() async => _exportPkcs8Key(_key);
210237
}
211238

212-
class _EcdsaPublicKey implements EcdsaPublicKey {
239+
final class _StaticEcdsaPublicKeyImpl implements StaticEcdsaPublicKeyImpl {
240+
const _StaticEcdsaPublicKeyImpl();
241+
242+
@override
243+
Future<EcdsaPublicKeyImpl> importRawKey(
244+
List<int> keyData, EllipticCurve curve) =>
245+
ecdsaPublicKey_importRawKey(keyData, curve);
246+
247+
@override
248+
Future<EcdsaPublicKeyImpl> importJsonWebKey(
249+
Map<String, dynamic> jwk,
250+
EllipticCurve curve,
251+
) =>
252+
ecdsaPublicKey_importJsonWebKey(jwk, curve);
253+
254+
@override
255+
Future<EcdsaPublicKeyImpl> importSpkiKey(
256+
List<int> keyData, EllipticCurve curve) =>
257+
ecdsaPublicKey_importSpkiKey(keyData, curve);
258+
}
259+
260+
final class _EcdsaPublicKeyImpl implements EcdsaPublicKeyImpl {
213261
final _EvpPKey _key;
214262

215-
_EcdsaPublicKey(this._key);
263+
_EcdsaPublicKeyImpl(this._key);
216264

217265
@override
218266
String toString() {
219-
return 'Instance of \'EcdsaPublicKey\'';
267+
return 'Instance of \'EcdsaPublicKeyImpl\'';
220268
}
221269

222270
@override

lib/src/impl_interface/impl_interface.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ part 'impl_interface.hmac.dart';
2525
part 'impl_interface.pbkdf2.dart';
2626
part 'impl_interface.aesgcm.dart';
2727
part 'impl_interface.ecdh.dart';
28+
part 'impl_interface.ecdsa.dart';
2829
part 'impl_interface.rsaoaep.dart';
2930

3031
/// A key-pair as returned from key generation.
@@ -83,6 +84,8 @@ abstract interface class WebCryptoImpl {
8384
StaticPbkdf2SecretKeyImpl get pbkdf2SecretKey;
8485
StaticEcdhPrivateKeyImpl get ecdhPrivateKey;
8586
StaticEcdhPublicKeyImpl get ecdhPublicKey;
87+
StaticEcdsaPrivateKeyImpl get ecdsaPrivateKey;
88+
StaticEcdsaPublicKeyImpl get ecdsaPublicKey;
8689
StaticRsaOaepPrivateKeyImpl get rsaOaepPrivateKey;
8790
StaticRsaOaepPublicKeyImpl get rsaOaepPublicKey;
8891
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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 StaticEcdsaPrivateKeyImpl {
18+
Future<EcdsaPrivateKeyImpl> importPkcs8Key(
19+
List<int> keyData, EllipticCurve curve);
20+
Future<EcdsaPrivateKeyImpl> importJsonWebKey(
21+
Map<String, dynamic> jwk, EllipticCurve curve);
22+
Future<(EcdsaPrivateKeyImpl, EcdsaPublicKeyImpl)> generateKey(
23+
EllipticCurve curve);
24+
}
25+
26+
abstract interface class EcdsaPrivateKeyImpl {
27+
Future<Uint8List> signBytes(List<int> data, Hash hash);
28+
Future<Uint8List> signStream(Stream<List<int>> data, Hash hash);
29+
Future<Uint8List> exportPkcs8Key();
30+
Future<Map<String, dynamic>> exportJsonWebKey();
31+
}
32+
33+
abstract interface class StaticEcdsaPublicKeyImpl {
34+
Future<EcdsaPublicKeyImpl> importRawKey(
35+
List<int> keyData, EllipticCurve curve);
36+
Future<EcdsaPublicKeyImpl> importJsonWebKey(
37+
Map<String, dynamic> jwk, EllipticCurve curve);
38+
Future<EcdsaPublicKeyImpl> importSpkiKey(
39+
List<int> keyData, EllipticCurve curve);
40+
}
41+
42+
abstract interface class EcdsaPublicKeyImpl {
43+
Future<bool> verifyBytes(List<int> signature, List<int> data, Hash hash);
44+
Future<bool> verifyStream(
45+
List<int> signature, Stream<List<int>> data, Hash hash);
46+
Future<Uint8List> exportRawKey();
47+
Future<Uint8List> exportSpkiKey();
48+
Future<Map<String, dynamic>> exportJsonWebKey();
49+
}

lib/src/impl_js/impl_js.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ final class _WebCryptoImpl implements WebCryptoImpl {
7171
@override
7272
final ecdhPublicKey = const _StaticEcdhPublicKeyImpl();
7373

74+
@override
75+
final ecdsaPrivateKey = const _StaticEcdsaPrivateKeyImpl();
76+
77+
@override
78+
final ecdsaPublicKey = const _StaticEcdsaPublicKeyImpl();
79+
7480
@override
7581
final rsaOaepPrivateKey = const _StaticRsaOaepPrivateKeyImpl();
7682

0 commit comments

Comments
 (0)