1 /*
2 * Copyright 2018 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty.handler.ssl;
17
18 import java.util.Locale;
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
21
22 /**
23 * Converts OpenSSL signature Algorithm names to
24 * <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Signature">
25 * Java signature Algorithm names</a>.
26 */
27 final class SignatureAlgorithmConverter {
28
29 private SignatureAlgorithmConverter() { }
30
31 // OpenSSL has 3 different formats it uses at the moment we will match against all of these.
32 // For example:
33 // ecdsa-with-SHA384
34 // hmacWithSHA384
35 // dsa_with_SHA224
36 //
37 // For more details see https://github.com/openssl/openssl/blob/OpenSSL_1_0_2p/crypto/objects/obj_dat.h
38 //
39 // BoringSSL uses a different format:
40 // https://github.com/google/boringssl/blob/8525ff3/ssl/ssl_privkey.cc#L436
41 //
42 private static final Pattern PATTERN = Pattern.compile(
43 // group 1 - 2
44 "(?:(^[a-zA-Z].+)With(.+)Encryption$)|" +
45 // group 3 - 4
46 "(?:(^[a-zA-Z].+)(?:_with_|-with-|_pkcs1_|_pss_rsae_)(.+$))|" +
47 // group 5 - 6
48 "(?:(^[a-zA-Z].+)_(.+$))");
49
50 /**
51 * Converts an OpenSSL algorithm name to a Java algorithm name and return it,
52 * or return {@code null} if the conversation failed because the format is not known.
53 */
54 static String toJavaName(String opensslName) {
55 if (opensslName == null) {
56 return null;
57 }
58 Matcher matcher = PATTERN.matcher(opensslName);
59 if (matcher.matches()) {
60 String group1 = matcher.group(1);
61 if (group1 != null) {
62 return group1.toUpperCase(Locale.ROOT) + "with" + matcher.group(2).toUpperCase(Locale.ROOT);
63 }
64 if (matcher.group(3) != null) {
65 return matcher.group(4).toUpperCase(Locale.ROOT) + "with" + matcher.group(3).toUpperCase(Locale.ROOT);
66 }
67
68 if (matcher.group(5) != null) {
69 return matcher.group(6).toUpperCase(Locale.ROOT) + "with" + matcher.group(5).toUpperCase(Locale.ROOT);
70 }
71 }
72 return null;
73 }
74 }