1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host.crypto;
16
17 import java.util.Set;
18
19 import org.htmlunit.corejs.javascript.Scriptable;
20 import org.htmlunit.corejs.javascript.ScriptableObject;
21 import org.htmlunit.corejs.javascript.VarScope;
22 import org.htmlunit.javascript.JavaScriptEngine;
23
24
25
26
27
28
29
30
31 final class AesKeyAlgorithm implements KeyAlgorithm {
32
33 static final Set<String> SUPPORTED_NAMES = Set.of("AES-CBC", "AES-CTR", "AES-GCM", "AES-KW");
34 static final Set<Integer> SUPPORTED_LENGTHS = Set.of(128, 192, 256);
35
36 private final String name_;
37 private final int length_;
38
39 AesKeyAlgorithm(final String name, final int length) {
40 if (!SUPPORTED_NAMES.contains(name)) {
41 throw new UnsupportedOperationException("AES " + name);
42 }
43 name_ = name;
44 length_ = length;
45 }
46
47
48
49
50
51
52
53 static AesKeyAlgorithm from(final Scriptable keyGenParams) {
54 final String name = SubtleCrypto.resolveAlgorithmName(keyGenParams);
55
56 final int length = (int) SubtleCrypto.getRequiredNumber(keyGenParams, "length");
57 return new AesKeyAlgorithm(name, length);
58 }
59
60 static boolean isSupported(final String name) {
61 return SUPPORTED_NAMES.contains(name);
62 }
63
64 @Override
65 public String getName() {
66 return name_;
67 }
68
69 int getLength() {
70 return length_;
71 }
72
73
74
75
76
77
78
79
80 @Override
81 public Scriptable toScriptableObject(final VarScope scope) {
82 final Scriptable algorithm = JavaScriptEngine.newObject(scope);
83 ScriptableObject.putProperty(algorithm, "name", getName());
84 ScriptableObject.putProperty(algorithm, "length", getLength());
85 return algorithm;
86 }
87 }