View Javadoc
1   /*
2    * GordianKnot: Security Suite
3    * Copyright 2012-2026. Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License.  You may obtain a copy
7    * of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14   * License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  package io.github.tonywasher.joceanus.gordianknot.api.keypair;
18  
19  import org.bouncycastle.asn1.ASN1ObjectIdentifier;
20  import org.bouncycastle.asn1.bc.BCObjectIdentifiers;
21  import org.bouncycastle.pqc.crypto.snova.SnovaParameters;
22  import org.bouncycastle.pqc.jcajce.spec.SnovaParameterSpec;
23  
24  /**
25   * Mayo KeySpec.
26   */
27  public enum GordianSnovaSpec {
28      /**
29       * Snova24A SSK.
30       */
31      SNOVA24A_SSK,
32  
33      /**
34       * Snova24A ESK.
35       */
36      SNOVA24A_ESK,
37  
38      /**
39       * Snova24A SHAKE SSK.
40       */
41      SNOVA24A_SHAKE_SSK,
42  
43      /**
44       * Snova24A SHAKE ESK.
45       */
46      SNOVA24A_SHAKE_ESK,
47  
48      /**
49       * Snova24B SSK.
50       */
51      SNOVA24B_SSK,
52  
53      /**
54       * SNova24B ESK.
55       */
56      SNOVA24B_ESK,
57  
58      /**
59       * SNova24B SHAKESSK.
60       */
61      SNOVA24B_SHAKE_SSK,
62  
63      /**
64       * SNova24B SHAKE ESK.
65       */
66      SNOVA24B_SHAKE_ESK,
67  
68      /**
69       * SNova25 SSK.
70       */
71      SNOVA25_SSK,
72  
73      /**
74       * SNova25 ESK.
75       */
76      SNOVA25_ESK,
77  
78      /**
79       * SNova25 SHAKE SSK.
80       */
81      SNOVA25_SHAKE_SSK,
82  
83      /**
84       * SNova25 SHAKE ESK.
85       */
86      SNOVA25_SHAKE_ESK,
87  
88      /**
89       * SNova29.
90       */
91      SNOVA29_SSK,
92  
93      /**
94       * SNova29.
95       */
96      SNOVA29_ESK,
97  
98      /**
99       * SNova29 SHAKE SSK.
100      */
101     SNOVA29_SHAKE_SSK,
102 
103     /**
104      * SNova29 SHAKE ESK.
105      */
106     SNOVA29_SHAKE_ESK,
107 
108     /**
109      * SNova37A SSK.
110      */
111     SNOVA37A_SSK,
112 
113     /**
114      * SNova37A ESK.
115      */
116     SNOVA37A_ESK,
117 
118     /**
119      * SNova37A SHAKE SSK.
120      */
121     SNOVA37A_SHAKE_SSK,
122 
123     /**
124      * SNova37A SHAKE ESK.
125      */
126     SNOVA37A_SHAKE_ESK,
127 
128     /**
129      * SNova37B SSK.
130      */
131     SNOVA37B_SSK,
132 
133     /**
134      * SNova37B ESK.
135      */
136     SNOVA37B_ESK,
137 
138     /**
139      * SNova37B SHAKE SSK.
140      */
141     SNOVA37B_SHAKE_SSK,
142 
143     /**
144      * SNova37B SHAKE ESK.
145      */
146     SNOVA37B_SHAKE_ESK,
147 
148     /**
149      * SNova49 SSK.
150      */
151     SNOVA49_SSK,
152 
153     /**
154      * SNova49 ESK.
155      */
156     SNOVA49_ESK,
157 
158     /**
159      * SNova49 SHAKE SSK.
160      */
161     SNOVA49_SHAKE_SSK,
162 
163     /**
164      * SNova49 SHAKE ESK.
165      */
166     SNOVA49_SHAKE_ESK,
167 
168     /**
169      * SNova56 SSK.
170      */
171     SNOVA56_SSK,
172 
173     /**
174      * SNova56 ESK.
175      */
176     SNOVA56_ESK,
177 
178     /**
179      * SNova56 SHAKE SSK.
180      */
181     SNOVA56_SHAKE_SSK,
182 
183     /**
184      * SNova56 SHAKE ESK.
185      */
186     SNOVA56_SHAKE_ESK,
187 
188     /**
189      * SNova60 SSK.
190      */
191     SNOVA60_SSK,
192 
193     /**
194      * SNova60 ESK.
195      */
196     SNOVA60_ESK,
197 
198     /**
199      * SNova60 SHAKE SSK.
200      */
201     SNOVA60_SHAKE_SSK,
202 
203     /**
204      * SNova60 SHAKE ESK.
205      */
206     SNOVA60_SHAKE_ESK,
207 
208     /**
209      * SNova66 SSK.
210      */
211     SNOVA66_SSK,
212 
213     /**
214      * SNova66 ESK.
215      */
216     SNOVA66_ESK,
217 
218     /**
219      * SNova66 SSK.
220      */
221     SNOVA66_SHAKE_SSK,
222 
223     /**
224      * SNova66 SHAKE ESK.
225      */
226     SNOVA66_SHAKE_ESK,
227 
228     /**
229      * SNova75 SSK.
230      */
231     SNOVA75_SSK,
232 
233     /**
234      * SNova75 ESK.
235      */
236     SNOVA75_ESK,
237 
238     /**
239      * SNova75 SHAKE SSK.
240      */
241     SNOVA75_SHAKE_SSK,
242 
243     /**
244      * SNova75 SHAKE ESK.
245      */
246     SNOVA75_SHAKE_ESK;
247 
248     /**
249      * Obtain Mayo Parameters.
250      *
251      * @return the parameters.
252      */
253     public SnovaParameters getParameters() {
254         switch (this) {
255             case SNOVA24A_SSK:
256                 return SnovaParameters.SNOVA_24_5_4_SSK;
257             case SNOVA24A_ESK:
258                 return SnovaParameters.SNOVA_24_5_4_ESK;
259             case SNOVA24A_SHAKE_SSK:
260                 return SnovaParameters.SNOVA_24_5_4_SHAKE_SSK;
261             case SNOVA24A_SHAKE_ESK:
262                 return SnovaParameters.SNOVA_24_5_4_SHAKE_ESK;
263             case SNOVA24B_SSK:
264                 return SnovaParameters.SNOVA_24_5_5_SSK;
265             case SNOVA24B_ESK:
266                 return SnovaParameters.SNOVA_24_5_5_ESK;
267             case SNOVA24B_SHAKE_SSK:
268                 return SnovaParameters.SNOVA_24_5_5_SHAKE_SSK;
269             case SNOVA24B_SHAKE_ESK:
270                 return SnovaParameters.SNOVA_24_5_5_SHAKE_ESK;
271             case SNOVA25_SSK:
272                 return SnovaParameters.SNOVA_25_8_3_SSK;
273             case SNOVA25_ESK:
274                 return SnovaParameters.SNOVA_25_8_3_ESK;
275             case SNOVA25_SHAKE_SSK:
276                 return SnovaParameters.SNOVA_25_8_3_SHAKE_SSK;
277             case SNOVA25_SHAKE_ESK:
278                 return SnovaParameters.SNOVA_25_8_3_SHAKE_ESK;
279             case SNOVA29_SSK:
280                 return SnovaParameters.SNOVA_29_6_5_SSK;
281             case SNOVA29_ESK:
282                 return SnovaParameters.SNOVA_29_6_5_ESK;
283             case SNOVA29_SHAKE_SSK:
284                 return SnovaParameters.SNOVA_29_6_5_SHAKE_SSK;
285             case SNOVA29_SHAKE_ESK:
286                 return SnovaParameters.SNOVA_29_6_5_SHAKE_ESK;
287             case SNOVA37A_SSK:
288                 return SnovaParameters.SNOVA_37_8_4_SSK;
289             case SNOVA37A_ESK:
290                 return SnovaParameters.SNOVA_37_8_4_ESK;
291             case SNOVA37A_SHAKE_SSK:
292                 return SnovaParameters.SNOVA_37_8_4_SHAKE_SSK;
293             case SNOVA37A_SHAKE_ESK:
294                 return SnovaParameters.SNOVA_37_8_4_SHAKE_ESK;
295             case SNOVA37B_SSK:
296                 return SnovaParameters.SNOVA_37_17_2_SSK;
297             case SNOVA37B_ESK:
298                 return SnovaParameters.SNOVA_37_17_2_ESK;
299             case SNOVA37B_SHAKE_SSK:
300                 return SnovaParameters.SNOVA_37_17_2_SHAKE_SSK;
301             case SNOVA37B_SHAKE_ESK:
302                 return SnovaParameters.SNOVA_37_17_2_SHAKE_ESK;
303             case SNOVA49_SSK:
304                 return SnovaParameters.SNOVA_49_11_3_SSK;
305             case SNOVA49_ESK:
306                 return SnovaParameters.SNOVA_49_11_3_ESK;
307             case SNOVA49_SHAKE_SSK:
308                 return SnovaParameters.SNOVA_49_11_3_SHAKE_SSK;
309             case SNOVA49_SHAKE_ESK:
310                 return SnovaParameters.SNOVA_49_11_3_SHAKE_ESK;
311             case SNOVA56_SSK:
312                 return SnovaParameters.SNOVA_56_25_2_SSK;
313             case SNOVA56_ESK:
314                 return SnovaParameters.SNOVA_56_25_2_ESK;
315             case SNOVA56_SHAKE_SSK:
316                 return SnovaParameters.SNOVA_56_25_2_SHAKE_SSK;
317             case SNOVA56_SHAKE_ESK:
318                 return SnovaParameters.SNOVA_56_25_2_SHAKE_ESK;
319             case SNOVA60_SSK:
320                 return SnovaParameters.SNOVA_60_10_4_SSK;
321             case SNOVA60_ESK:
322                 return SnovaParameters.SNOVA_60_10_4_ESK;
323             case SNOVA60_SHAKE_SSK:
324                 return SnovaParameters.SNOVA_60_10_4_SHAKE_SSK;
325             case SNOVA60_SHAKE_ESK:
326                 return SnovaParameters.SNOVA_60_10_4_SHAKE_ESK;
327             case SNOVA66_SSK:
328                 return SnovaParameters.SNOVA_66_15_3_SSK;
329             case SNOVA66_ESK:
330                 return SnovaParameters.SNOVA_66_15_3_ESK;
331             case SNOVA66_SHAKE_SSK:
332                 return SnovaParameters.SNOVA_66_15_3_SHAKE_SSK;
333             case SNOVA66_SHAKE_ESK:
334                 return SnovaParameters.SNOVA_66_15_3_SHAKE_ESK;
335             case SNOVA75_SSK:
336                 return SnovaParameters.SNOVA_75_33_2_SSK;
337             case SNOVA75_ESK:
338                 return SnovaParameters.SNOVA_75_33_2_ESK;
339             case SNOVA75_SHAKE_SSK:
340                 return SnovaParameters.SNOVA_75_33_2_SHAKE_SSK;
341             case SNOVA75_SHAKE_ESK:
342                 return SnovaParameters.SNOVA_75_33_2_SHAKE_ESK;
343             default:
344                 throw new IllegalArgumentException();
345         }
346     }
347 
348     /**
349      * Obtain Mayo ParameterSpec.
350      *
351      * @return the parameters.
352      */
353     public SnovaParameterSpec getParameterSpec() {
354         switch (this) {
355             case SNOVA24A_SSK:
356                 return SnovaParameterSpec.SNOVA_24_5_4_SSK;
357             case SNOVA24A_ESK:
358                 return SnovaParameterSpec.SNOVA_24_5_4_ESK;
359             case SNOVA24A_SHAKE_SSK:
360                 return SnovaParameterSpec.SNOVA_24_5_4_SHAKE_SSK;
361             case SNOVA24A_SHAKE_ESK:
362                 return SnovaParameterSpec.SNOVA_24_5_4_SHAKE_ESK;
363             case SNOVA24B_SSK:
364                 return SnovaParameterSpec.SNOVA_24_5_5_SSK;
365             case SNOVA24B_ESK:
366                 return SnovaParameterSpec.SNOVA_24_5_5_ESK;
367             case SNOVA24B_SHAKE_SSK:
368                 return SnovaParameterSpec.SNOVA_24_5_5_SHAKE_SSK;
369             case SNOVA24B_SHAKE_ESK:
370                 return SnovaParameterSpec.SNOVA_24_5_5_SHAKE_ESK;
371             case SNOVA25_SSK:
372                 return SnovaParameterSpec.SNOVA_25_8_3_SSK;
373             case SNOVA25_ESK:
374                 return SnovaParameterSpec.SNOVA_25_8_3_ESK;
375             case SNOVA25_SHAKE_SSK:
376                 return SnovaParameterSpec.SNOVA_25_8_3_SHAKE_SSK;
377             case SNOVA25_SHAKE_ESK:
378                 return SnovaParameterSpec.SNOVA_25_8_3_SHAKE_ESK;
379             case SNOVA29_SSK:
380                 return SnovaParameterSpec.SNOVA_29_6_5_SSK;
381             case SNOVA29_ESK:
382                 return SnovaParameterSpec.SNOVA_29_6_5_ESK;
383             case SNOVA29_SHAKE_SSK:
384                 return SnovaParameterSpec.SNOVA_29_6_5_SHAKE_SSK;
385             case SNOVA29_SHAKE_ESK:
386                 return SnovaParameterSpec.SNOVA_29_6_5_SHAKE_ESK;
387             case SNOVA37A_SSK:
388                 return SnovaParameterSpec.SNOVA_37_8_4_SSK;
389             case SNOVA37A_ESK:
390                 return SnovaParameterSpec.SNOVA_37_8_4_ESK;
391             case SNOVA37A_SHAKE_SSK:
392                 return SnovaParameterSpec.SNOVA_37_8_4_SHAKE_SSK;
393             case SNOVA37A_SHAKE_ESK:
394                 return SnovaParameterSpec.SNOVA_37_8_4_SHAKE_ESK;
395             case SNOVA37B_SSK:
396                 return SnovaParameterSpec.SNOVA_37_17_2_SSK;
397             case SNOVA37B_ESK:
398                 return SnovaParameterSpec.SNOVA_37_17_2_ESK;
399             case SNOVA37B_SHAKE_SSK:
400                 return SnovaParameterSpec.SNOVA_37_17_2_SHAKE_SSK;
401             case SNOVA37B_SHAKE_ESK:
402                 return SnovaParameterSpec.SNOVA_37_17_2_SHAKE_ESK;
403             case SNOVA49_SSK:
404                 return SnovaParameterSpec.SNOVA_49_11_3_SSK;
405             case SNOVA49_ESK:
406                 return SnovaParameterSpec.SNOVA_49_11_3_ESK;
407             case SNOVA49_SHAKE_SSK:
408                 return SnovaParameterSpec.SNOVA_49_11_3_SHAKE_SSK;
409             case SNOVA49_SHAKE_ESK:
410                 return SnovaParameterSpec.SNOVA_49_11_3_SHAKE_ESK;
411             case SNOVA56_SSK:
412                 return SnovaParameterSpec.SNOVA_56_25_2_SSK;
413             case SNOVA56_ESK:
414                 return SnovaParameterSpec.SNOVA_56_25_2_ESK;
415             case SNOVA56_SHAKE_SSK:
416                 return SnovaParameterSpec.SNOVA_56_25_2_SHAKE_SSK;
417             case SNOVA56_SHAKE_ESK:
418                 return SnovaParameterSpec.SNOVA_56_25_2_SHAKE_ESK;
419             case SNOVA60_SSK:
420                 return SnovaParameterSpec.SNOVA_60_10_4_SSK;
421             case SNOVA60_ESK:
422                 return SnovaParameterSpec.SNOVA_60_10_4_ESK;
423             case SNOVA60_SHAKE_SSK:
424                 return SnovaParameterSpec.SNOVA_60_10_4_SHAKE_SSK;
425             case SNOVA60_SHAKE_ESK:
426                 return SnovaParameterSpec.SNOVA_60_10_4_SHAKE_ESK;
427             case SNOVA66_SSK:
428                 return SnovaParameterSpec.SNOVA_66_15_3_SSK;
429             case SNOVA66_ESK:
430                 return SnovaParameterSpec.SNOVA_66_15_3_ESK;
431             case SNOVA66_SHAKE_SSK:
432                 return SnovaParameterSpec.SNOVA_66_15_3_SHAKE_SSK;
433             case SNOVA66_SHAKE_ESK:
434                 return SnovaParameterSpec.SNOVA_66_15_3_SHAKE_ESK;
435             case SNOVA75_SSK:
436                 return SnovaParameterSpec.SNOVA_75_33_2_SSK;
437             case SNOVA75_ESK:
438                 return SnovaParameterSpec.SNOVA_75_33_2_ESK;
439             case SNOVA75_SHAKE_SSK:
440                 return SnovaParameterSpec.SNOVA_75_33_2_SHAKE_SSK;
441             case SNOVA75_SHAKE_ESK:
442                 return SnovaParameterSpec.SNOVA_75_33_2_SHAKE_ESK;
443             default:
444                 throw new IllegalArgumentException();
445         }
446     }
447 
448     /**
449      * Obtain MAYO algorithm Identifier.
450      *
451      * @return the identifier.
452      */
453     public ASN1ObjectIdentifier getIdentifier() {
454         switch (this) {
455             case SNOVA24A_SSK:
456                 return BCObjectIdentifiers.snova_24_5_4_ssk;
457             case SNOVA24A_ESK:
458                 return BCObjectIdentifiers.snova_24_5_4_esk;
459             case SNOVA24A_SHAKE_SSK:
460                 return BCObjectIdentifiers.snova_24_5_4_shake_ssk;
461             case SNOVA24A_SHAKE_ESK:
462                 return BCObjectIdentifiers.snova_24_5_4_shake_esk;
463             case SNOVA24B_SSK:
464                 return BCObjectIdentifiers.snova_24_5_5_ssk;
465             case SNOVA24B_ESK:
466                 return BCObjectIdentifiers.snova_24_5_5_esk;
467             case SNOVA24B_SHAKE_SSK:
468                 return BCObjectIdentifiers.snova_24_5_5_shake_ssk;
469             case SNOVA24B_SHAKE_ESK:
470                 return BCObjectIdentifiers.snova_24_5_5_shake_esk;
471             case SNOVA25_SSK:
472                 return BCObjectIdentifiers.snova_25_8_3_ssk;
473             case SNOVA25_ESK:
474                 return BCObjectIdentifiers.snova_25_8_3_esk;
475             case SNOVA25_SHAKE_SSK:
476                 return BCObjectIdentifiers.snova_25_8_3_shake_ssk;
477             case SNOVA25_SHAKE_ESK:
478                 return BCObjectIdentifiers.snova_25_8_3_shake_esk;
479             case SNOVA29_SSK:
480                 return BCObjectIdentifiers.snova_29_6_5_ssk;
481             case SNOVA29_ESK:
482                 return BCObjectIdentifiers.snova_29_6_5_esk;
483             case SNOVA29_SHAKE_SSK:
484                 return BCObjectIdentifiers.snova_29_6_5_shake_ssk;
485             case SNOVA29_SHAKE_ESK:
486                 return BCObjectIdentifiers.snova_29_6_5_shake_esk;
487             case SNOVA37A_SSK:
488                 return BCObjectIdentifiers.snova_37_8_4_ssk;
489             case SNOVA37A_ESK:
490                 return BCObjectIdentifiers.snova_37_8_4_esk;
491             case SNOVA37A_SHAKE_SSK:
492                 return BCObjectIdentifiers.snova_37_8_4_shake_ssk;
493             case SNOVA37A_SHAKE_ESK:
494                 return BCObjectIdentifiers.snova_37_8_4_shake_esk;
495             case SNOVA37B_SSK:
496                 return BCObjectIdentifiers.snova_37_17_2_ssk;
497             case SNOVA37B_ESK:
498                 return BCObjectIdentifiers.snova_37_17_2_esk;
499             case SNOVA37B_SHAKE_SSK:
500                 return BCObjectIdentifiers.snova_37_17_2_shake_ssk;
501             case SNOVA37B_SHAKE_ESK:
502                 return BCObjectIdentifiers.snova_37_17_2_shake_esk;
503             case SNOVA49_SSK:
504                 return BCObjectIdentifiers.snova_49_11_3_ssk;
505             case SNOVA49_ESK:
506                 return BCObjectIdentifiers.snova_49_11_3_esk;
507             case SNOVA49_SHAKE_SSK:
508                 return BCObjectIdentifiers.snova_49_11_3_shake_ssk;
509             case SNOVA49_SHAKE_ESK:
510                 return BCObjectIdentifiers.snova_49_11_3_shake_esk;
511             case SNOVA56_SSK:
512                 return BCObjectIdentifiers.snova_56_25_2_ssk;
513             case SNOVA56_ESK:
514                 return BCObjectIdentifiers.snova_56_25_2_esk;
515             case SNOVA56_SHAKE_SSK:
516                 return BCObjectIdentifiers.snova_56_25_2_shake_ssk;
517             case SNOVA56_SHAKE_ESK:
518                 return BCObjectIdentifiers.snova_56_25_2_shake_esk;
519             case SNOVA60_SSK:
520                 return BCObjectIdentifiers.snova_60_10_4_ssk;
521             case SNOVA60_ESK:
522                 return BCObjectIdentifiers.snova_60_10_4_esk;
523             case SNOVA60_SHAKE_SSK:
524                 return BCObjectIdentifiers.snova_60_10_4_shake_ssk;
525             case SNOVA60_SHAKE_ESK:
526                 return BCObjectIdentifiers.snova_60_10_4_shake_esk;
527             case SNOVA66_SSK:
528                 return BCObjectIdentifiers.snova_66_15_3_ssk;
529             case SNOVA66_ESK:
530                 return BCObjectIdentifiers.snova_66_15_3_esk;
531             case SNOVA66_SHAKE_SSK:
532                 return BCObjectIdentifiers.snova_66_15_3_shake_ssk;
533             case SNOVA66_SHAKE_ESK:
534                 return BCObjectIdentifiers.snova_66_15_3_shake_esk;
535             case SNOVA75_SSK:
536                 return BCObjectIdentifiers.snova_75_33_2_ssk;
537             case SNOVA75_ESK:
538                 return BCObjectIdentifiers.snova_75_33_2_esk;
539             case SNOVA75_SHAKE_SSK:
540                 return BCObjectIdentifiers.snova_75_33_2_shake_ssk;
541             case SNOVA75_SHAKE_ESK:
542                 return BCObjectIdentifiers.snova_75_33_2_shake_esk;
543             default:
544                 throw new IllegalArgumentException();
545         }
546     }
547 }