blob: 6d84cb3b28b10e15ae0bdf0c83f02c681376c9b3 [file] [log] [blame]
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package com.google.crypto.tink.subtle;
import static org.junit.Assert.assertThrows;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.RSAPublicKeySpec;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Unit tests for {@link SelfKeyTestValidators}. */
@RunWith(JUnitParamsRunner.class)
public class SelfKeyTestValidatorsTest {
private RSAPublicKey publicRsaKey;
private RSAPrivateCrtKey privateRsaKey;
private ECPrivateKey privateEcdsaKey;
private ECPublicKey publicEcdsaKey;
// These are keys only used for testing, generated with openssl CLI.
// openssl genrsa -out private-key4096.pem 4096
// openssl rsa -in private-key4096.pem -text -noout
private static final String[] RSAKEY_2048 = {
// N
"00a5af78921b98763aa4578fd75b7aeb13f7bd7694e5fcf0e25d0c01424374d5cf1c2429c2d94ec1aea4782c0b34dfc63165daabd2573aa90ef6ef5176c985af467d06e68bfb24632f353e650895205777c368fe01593a705d0d300c90b7b7fe09c5012eb07cec76726567f5dfa3c0e73e7d50524e15cc7fac9c47c5d94729b56f0a604485a426716d9e29f43d1c08e4967878ae230f074a97a4e8d17d37dfc6ced5c59485a0640b3b1b6c77816c9123490e49813f43847588689d4c4989d653a92069a8bac5c4fa13abc95b3a27bb0a1a5097e97fd4dd3575656a057715c2a7f3a70058f8f6e7f1ca957cf45f1b748a0f8c2ccd2a51cda862ee25e9346daedd67",
// D
"6e512b427d45425341615bd0d4843f4988468a5211e01cb35ba8c69dcc345ab80fd0b44d9c4b28029457bf5ba6d4e82db3d7a957dfe49af3efcee0baeaeb2c0d0eea2d4f3ee4b7759349fc137ed78de59c22a81d55bfe758cd93148ab708b708e2372b532f9a723330f9cb6820ac2c4c1b3c03d1220a8b67ee968b5164648cfc53f68b8672aee8177c7d75f7782349ee5396ae796111740a56f797e2bfb2aa3893bd0cb84f375842977578458ca0cd7c8eada0549ed7a7dce08088d89f4d364aae77dc2e3f752f8056947c5f347a480bd3f9bf64b9ae0b6d20dc87a40da3d7a330c64dc9583411deab6aaa846ca719559ae2fb9e2b136ee711f94adc2aaf4421",
// P
"00ce36c71ab928dcef3783fce65dca82b68a9d2cae54d27f8fcd37c0e636bb1e86fbbba6f2ef4f9ede77563353e80fd4ecc853797d6abc5c09b52a5ad4ac239213c5d385c4548f68cb086146b7e3aafc0ea636f9a9b20d6eadcba0947224a6114e4f1b03f058717d00bc6a6db470b105c1a55a38bbf3d43cf7d6fc361d044defa5",
// Q
"00cdafcb345832874a952d730cf97536558f41b117e5284d5de6befcc5248be076fc326ddbbe9343c6bc7dfdce72b413735d1c2b75e9b31ab64ab546ae6dea32f3d3b51ee9fbc2cc152fcdd0aaffd5f8a7a64f451fbec7947ebc03eaff2354d4beaf651e1f8ed3536d0d6b4a32a991d96a1b8694549baec88b2a1f3a7c97788b1b",
// dP
"5ddd333de7c040e8a6656ecd512de7d7bd3a93e6fa7722574b7b3053d9dfcca2769d50fdcd8e796b1bf8e1be34a8582c3b773b9aa9e5f922f612c46b7fbb653798d9924eee8aa4919e4be10bbd16cc4ac2bfcd5ebfcc3b6fe27b4276be55d514c70f2df8cdd942a3fe1f97b605819e742996eab22ae795a4de77c90de632af7d",
// dQ
"00a0e28671952340cbc7cfdb1424f3d7e228c1db81b34f48e4d01e479cf4af2c8e254a54bff35b41426c21a8ab18f15ddd78d115f58f2cf711eb71cbad986ffe16d65befa859b2ceeb2b8f334eedfa321b006d34c655f5ca632f316958d40c00b47e80fb84f7b4b8a6ae3e63b52909da23b3101b69eab4564cf44fa4f1db91004d",
// crt
"008ca975a95b86bb7e98e58dccb8b7f26d80cd47e389e898f0dc7281f97283981ad748be97ba335ea867ea126197f9f4df1ea33bc383375ce13b08d346ba54f11ccaa71f3314451db255275f090a88a266007b1ea27b762d2ba37e454e7c4f13d798af6f537348b583b13ddfbfd90997d118df8d5d9c369ec28230c415a71c1bf3",
};
private static final String[] RSAKEY_3072 = {
// N
"00d3764ebdb48112dfefee52feaad8c89f6b8be358780f77808838ed8565099c0c3c0217543ca8cacd4d9de52c6c1264f3ca3c648671e8b336e9560ea28f7830b775402d8224f3c8b5645958d389dcef47f35c20a65c0a2ece6b68bdcbfabb30a92ba2b59b5022ba50accc16113d6d30053bb079685169c454a93f492d6f17d4c7e770b20e7175577284f3505789d127013ada0c44aac2167c47d8a4de377ab9408cf7d5319218ed666b317d459c829133e70906d05bb3138bc593ce7b025705aae3244bb634eaa70047204ed8b13c9ce9fbc4fa0277afe5831897cc838c7fe92a8eaadc1961a70c95254b363efea78dfcdba9683b4105c2e19384fdec569d6c04c89e7f3eac198c05c906e523e5a63e047f45295f3fa7ec3801b7f1d52064218551052753973f184ff85a5e8938ac621adfcbcffe8f3cb936263b026a2e09fcd88510dc37f31d3acf49046d3ea44c453414c70c0cae341411825fc38edfe4d6743dfaafa0b1b4a2f37775c7c75c40f76f1bf01e9be123820da1e34c59e4700fdf",
// D
"00b6c2efb72204d48d5b4f3dc8015d2fb82939541aa859a5cd1eef24ca3fd3185db297941627ff32985256ff356f8a4e5a2e161843e2bb5df93d9e3533e68fd87b17098acb8aa87075e5ef1ac869c4dbc1f1e1540eb449d0be7332a9a75c62e0e1b5670152e4e5bee5ef12cc97c5e152b993272927320619bb9a33aa496c54ca80a3d550ef0ebc7e01ea4a68cbdfbf36d8e7468187ef95a3dd723319fb3d34025c79f9d0f6f0f03e6e6082fb6468aaa858957bc5b9db2760e352b636a53616843be5b7e3d30303f6c6cc9717c490bbb178cb0f6ef5e741acbd684f2d3743138de5bf14b95df8005bb312a0ae24b9182df6ae0b119f812f6b708f6edb4eac9f81621511ad10a07c006db7e0c4da38c947fe75704d21b3e3439ae478116d1af6b58c02cc9d12c92186069f5261e3da5bebb63919734851d24a102006672036f1698361f8d6ce674da3f627740c0ad410ddee5207e29d531316d16bcdc33a54e9ad767c68ab72f1abdca33ecc2062cc0a9fd6f8664cc62fb8ad07d9ae840f7ba8d281",
// P
"00ea1c453458fdc7e8569b5a44eec1ac99b9a559184cb0423d80e0f7651216dc1453ecd6eb1608b8673367758e20fa73d1586e539598dc8354e30d04672e0a1124281b741c7fa63cc589bcd91be7dff264765d20e6757ad3542b522246211bbab38c81480a14240db0fb4055e4caf704672f7bc23a19f3a7365ed0ca252cce29e5b09e60477756025d3ebd0af051fa3ab30a9626251473cb0fc2ed471403ac2e0658a8a67ebf152bfb1a83d752fe42883a5805b95eead77de7d0bb0b48dc1f2b61",
// Q
"00e73bebf479037d11942a81da53a18909c24a2d16cb2cf5e2b08f75b2efe8589f2dab5ecae97372b520049907899925da93491c6d624f925df87ca0653dc593b0dc96733a56685e33ff6824f2a90d5969402694fc93bcd0709ae5abcfea491868edd94431dd5574f096b80663f5ab2470100583bafae43aac7db988a96298cefa0ba615e87277b4a9d9dad33cf4eb643d7b14bcea54f3a0e497f0c025ac8571c951b211af7a9afd295bb5a46be2ed6a00588178c9ac6ca9997190d48602aa433f",
// dP
"00866af6fd487f6651abb0855300f768dfd6ecee4bfa74558434c476a7ac8c3d8eda65293d4fa87020a92e251c1729566883eaccc91f3cb5977eca5195e0a45d15328618d3e8230dcfa9f7297d51548f3b498ecd3e25840164d97ece390ff778ea70a92630cb41ac2ecb04348d2a504c51e6bc9b577ae120482286a51a55308673e045ff27e98813d1701d60f37d4e3c77e28335a1a2ad9d910e2de8dac00513640771c62f0e0ddcf3cf5495c48c42ad2f3aad06b34e09aebbf46800e1b3a99de1",
// dQ
"301482947bd120e155d89cd583cc33cd66abbbc2608ec1b5d8168c579f90c5549bcf654f75c93e91b0cda3f030493ad8bf0555b6dcd944caeb4f269ec6805d9c49d1b2b5ef9f95eee3ed88b938338162e426e195bf366474f59049f05a7bc66a9302392ed121e2c5dfe0f5db350ad7f1c1331457fdb1150e26ba3c53542007f17018a1b78a8d9f702dcf555af866359a9f0c09d803c000b5676e74d5a090c2bf24908d22dab07d716b1352d3e8048ba4f4c23f165816e410f6cf319187de554b",
// crt
"00abe67e2e70a261aa1f489bcb6237f06f7d9c650f40bdc60570ec624d1914300339c2fe4dbc14b03e839007e09fc52c060bf94179e87e505b993ceff03e67c542769e035a8f7607ad88b65214fd4c702c7a4e469be64b5562e5ce8ffda2ce2b720ade8b9ea6c750678239f3c136fee1970d3c88db26cdec535b6376237f09ce1ab655822f6f78ce98b869116711a002fbb6046c2ec192224600d06b6eb46a5912353f61860d1ed5cd2d01b4fc7d17a4a7771137b427868100ef2b417fc003341b",
};
private static final String[] RSAKEY_4096 = {
// N
"00b81c5e5753c233a3cdf8a1d928122b2f2c489af9e05167f481b1dd420ddf4eb57dc2da0541ff2403ec5302c4c44edaac046de4b94658146f4705ca60ce8de9f58eb4b0c660062c16c0600a3e5988c09d0aaf4607a62cae34ffd88db9bb1d1110c01a0117db0b233eeaa66621638fcfff548a778fec609b5adfa336f51eb1c63128affee1cfd4657bb6aac4fe3b08f642e2dc49cf4138f6335a230994ab12522c6d4e909f0f44cd430f0cc95b8d05dc89ded0a0dd1ba83206ed37d1223efaddc4b7ae373f05af1e00d2edde29e30f5152e270d2f50eb305b90d4c8825d6901fdbaf7df561a017a9a49221cba49a51efb88ebfe2639183eeae81f40a008cb9eb9045fb402863a82f7d41a691098d4d9cb8dcd44001b1956727f5f515cd1fb718d3c70fa70ebd5a92a6e2f1fd53d0abfa2c840fdf2f34a43ba6f7ab58d8e055e5684a631c08773d5b85469ca3d7d3137f358ff483e1d99c97d62d7a620488cd2bd963a3e97c5385123ed41f781c57a8456f32c80f096dcf8b823a18a289853d2b19411dded7d91c59380b883907c63e8f3fc75c2836ed6c4dfe04a8f919342b63278c8b5285e4706fda095f5a3286aa70e5cdd074f99358c98f53a9921270b44114824b9d89de39a0cffb6d496589798b55a629350422a84f2acf59a94e02d280beb75d439da4264791c7ef5efcd7bb5c4a8f129fce3c61a47e8601af9799490dc5",
// D
"58b32228846beda11f5c87ed2d470393288c9a4d846af3e07293947b7c5f77762ceeb1471332aed14d0bf92b7f40564dc59c843356d69c91b7efec3e9384ff90947e2d2485a2b39f0a73babbab3b1d410ba2c1e47184d9312389db4dfdfdd4f8f2f4144ebff32fb9e226e4d1753c160377617694da56f8c1e138ab03911428de0a323063ee52efc99889d17a824aa10a3c6dd1098eecb880a90e745131d213d0dfa098406984c637668acc7fd5035beaf8741eec27a4f2e52f6852d362f04de3b672b29f2447e7f691a893fe2e2c750baf9897aa04b8ef2ae66356bc9410bfa88175f7c05ef6c77e48010c31733fc2747221b41a304315bcf152f776a855f24caf9e180bc62889747a3adcf450cbe739addf9975aa1b4536360f8f08d312d92a32cbc62e416c173c2140404302c7a59c6f842da8dcb85be07485c39f4a417f91d797dea5b43ef28948bd1c8f8b13a5923fb77e1f01814f9c7b0b2aba0634116dbdf9e74cf50cd73fd61dbd25e6de60b89be0d0d4bb19f6eef21d4c787d6760a87b161b88c05a0ce1098afaf8e93c313d7dfcb35a9c64746703b235e707ee1ebeef6cca1bbd08bbce24aa03b551e0c07e9e53c9079b9aad7e58e2d755ea28ee414d713b78b55c4f7c9c900b0debc29ffaf6002670bc6bce850ae7736c5dd3aedf5a305b0ba23167811e2fd11708115e7cff41f620a117803a110cc40303fa13c9",
// P
"00ef3538945cf94c1c402ca845e550b609e53de60baaaf82f19878d910e2239eb6dd6892dba589387f12c4c022ed7585a6a97045e7b7b83bbd9392b30cd06085b5d3d1c07ae60d01c5dfbbe9e82089b50038e9ba9ea0cd59feb05ca3db0ea68a77f212adaedf462ac16d3aeb27af888e8ff00f02da3c6d0da2e6e6a20998ac68788d18cdf5bb0a4632cc44a2473b1ea396115472fe65ea8b64e02a1ec834b0cb0c750048b440dda111466d8e3c45b13c2aa002c35fff467c31722bdcb99d452621d25300d6e3e086f4f51a6508e052b8e2ebe8afeace36bfd668a4ae08ce40a661767318c7c2d63a6aa5fb868ce73cc54d07db95975596679de4c97c5017864437",
// Q
"00c50900fee3163808a5e4f0cc3c8605b95a4449ccbeae5fb3507b66bf5e8bacdc320a6082e0dc002bfe31bc1a3595826b50d0e2ae19548e05605940219a20a7c832ffa3cc54e072d913d5489927ff12f4202324cc12198476acb66ef014e5f2c0e0fd4d532efd46b4377b231e1ab81d4cbecfb62dd4d1a28fbec4fa56e1fa429eebe9402d922327e5d13d3a632bb7bef554f9fe9e93ef914e671dda4a450d4708bbf545b74fb37dfd5884b9ca11a384ae373ce42653b97ec4a76991046d275497f220a86c76ed252263eec7413785c8c96f1941f968f7eee62fc379d20bd9ed47a113c46a8560621a84e911591d4365b93a9ea1c362cfd5197098fbf8002377e3",
// dP
"009d5b7d64dbe48354f2426e4fcc9253ae1ec7a1557b6b09d0b4648b26b81c8683f5129dc930141cbe3b3282d2773320408aa5f8d67ddd0c2fa1ac976c8e87706e34717f1559d0a4a1ee944743146482552b1b565093a782d4306040ca11d12cb5cae0ceb082e03db01092f9ae99a253660c9d535b0cf5104b6169c69e5978d120bc70dccc11c6a8773238d427d7944838a81dcda7dc93762f5de757688c80e091c945ee8de53de67edebda31bb31cec5f7df353630b22eafffc032ea84bf4f928b69b33aa292dc299d1c31343cb8d9f62679e225b6c5c47c65c00391c41d1f5a197b20f5319b0a3ad149369e7b7161b14995eb20163a41575a0d38a9b855e25f1",
// dQ
"0186374ec17cfb83fd9c8ecc55af87bdce57f6e6319771c016604e042efc0fa34873d219511a029a548617f96feeaf2a9b5e72527c79adfb96aa3a17c8747637d3452d0438a7dfdb940eb35813fa2230674b3e4ea1d936b02057ecf5c8839ae429196c8eb72f586bae7e32605a3e9063769a6ec35e011d2bd582fa98cf78bb293594015e18e252bdb167b2daef8ca55a8a84c096837877fc4e49e9d567415a0a5441ea7f278bb0eed3cf7b0c782476b34e541743c0a40fb9ffbd8e54a56f87750177853609997e0f0d0cdcd7c15134a3724b94ba1438cecd5313450efdee7aaa72318ff46f01b6e093a4a5f0b58c3eee36e8e1417cb334e7d47a2a80d9a76c97",
// crt
"00b3de05bd6644917afad4817f0609933c8b5cd46f04cfbc21fa0220296d474759b8da325da8061eb4a53f8bc3e1537b2a18c1414ae71f02f527f2d8e4e4b0b5d6feeb1191cb00db5d88a6573b4afdb4fc162eff4d062905e0f7ae50d7277a67c90762422e1604ab371a3319f01d19e7c6574a18163518ade29b4850d9fbc64e49b8586258060593f464b1dc5793412f6faec86a326424ddfae21567249f7e7d3cf4d394d972d9d448773aa7d7856e7bfb7cff16e942b5010ce94932682a78ebb0a58bd067cfe95ef0926a120ecd289758025ddda6a42e1622d7bdf6679756da06687add83423def17a3b0a9815a472354a9b9c82b71223465c04c311d10bbb400",
};
// generated with openssl ecparam -genkey -name prime256v1 -out ec256.pem
// openssl ec -in ec256.pem -text -noout
// http://tools.ietf.org/html/rfc5480#section-2.2:
// 04 means there is no compression
// 03 means there is a compression and select y as positive
// 02 means there is a compression and select y as negative
private static final byte[][] ECDSAKEY_256 = {
// pubX
{
(byte) 0x52, (byte) 0x46, (byte) 0x92, (byte) 0x45, (byte) 0x30, (byte) 0x2b, (byte) 0x25,
(byte) 0x47, (byte) 0x07, (byte) 0xd7, (byte) 0xcd, (byte) 0xe7, (byte) 0x09, (byte) 0x0e,
(byte) 0x27,
(byte) 0x9f, (byte) 0x37, (byte) 0x44, (byte) 0x58, (byte) 0x8e, (byte) 0x0d, (byte) 0xd6,
(byte) 0x8b, (byte) 0xfa, (byte) 0xe0, (byte) 0x46, (byte) 0x81, (byte) 0x8a, (byte) 0x99,
(byte) 0x3f,
(byte) 0xee, (byte) 0x02
},
// pubY
{
(byte) 0xdc, (byte) 0x63, (byte) 0xb3, (byte) 0xfe, (byte) 0x58, (byte) 0xd0, (byte) 0x4b,
(byte) 0x35, (byte) 0x6c, (byte) 0xa9, (byte) 0x81, (byte) 0x22, (byte) 0x5a, (byte) 0x97,
(byte) 0xe7,
(byte) 0xbe, (byte) 0x70, (byte) 0x78, (byte) 0x22, (byte) 0xc5, (byte) 0x2b, (byte) 0x22,
(byte) 0x13, (byte) 0x3a, (byte) 0x52, (byte) 0x4d, (byte) 0x0a, (byte) 0x7c, (byte) 0xcc,
(byte) 0xdd,
(byte) 0x0a, (byte) 0x5d
},
// Priv
{
(byte) 0x07, (byte) 0x6e, (byte) 0x85, (byte) 0x27, (byte) 0xa1, (byte) 0xb4, (byte) 0x53,
(byte) 0x03, (byte) 0xdc, (byte) 0x6f, (byte) 0x7f, (byte) 0xb8, (byte) 0xd8, (byte) 0xdc,
(byte) 0x44,
(byte) 0x4d, (byte) 0x75, (byte) 0x19, (byte) 0x85, (byte) 0xc7, (byte) 0xe6, (byte) 0x12,
(byte) 0xbb, (byte) 0x69, (byte) 0x75, (byte) 0x5f, (byte) 0xac, (byte) 0x3e, (byte) 0xe4,
(byte) 0xa6,
(byte) 0x24, (byte) 0x71
}
};
private static final byte[][] ECDSAKEY_384 = {
// pubX
{
(byte) 0x70,
(byte) 0xf0,
(byte) 0x26,
(byte) 0xee,
(byte) 0x16,
(byte) 0x6b,
(byte) 0x7f,
(byte) 0x12,
(byte) 0xbb,
(byte) 0x24,
(byte) 0x04,
(byte) 0x62,
(byte) 0x57,
(byte) 0x2f,
(byte) 0x39,
(byte) 0x08,
(byte) 0xc1,
(byte) 0x21,
(byte) 0x36,
(byte) 0xfa,
(byte) 0x47,
(byte) 0x6d,
(byte) 0x46,
(byte) 0x87,
(byte) 0x80,
(byte) 0x43,
(byte) 0x9e,
(byte) 0x16,
(byte) 0x92,
(byte) 0x93,
(byte) 0x6e,
(byte) 0x5a,
(byte) 0x39,
(byte) 0xe0,
(byte) 0x2d,
(byte) 0xaa,
(byte) 0x25,
(byte) 0x46,
(byte) 0x1f,
(byte) 0x04,
(byte) 0x7d,
(byte) 0xfc,
(byte) 0x5b,
(byte) 0xb2,
(byte) 0x28,
(byte) 0xab,
(byte) 0x72,
(byte) 0xb8
},
// pubY
{
(byte) 0x23,
(byte) 0x44,
(byte) 0x5f,
(byte) 0xa0,
(byte) 0x2d,
(byte) 0x6a,
(byte) 0x36,
(byte) 0xf4,
(byte) 0x48,
(byte) 0x4b,
(byte) 0x9e,
(byte) 0x72,
(byte) 0x15,
(byte) 0x30,
(byte) 0x30,
(byte) 0xbe,
(byte) 0xa5,
(byte) 0x4e,
(byte) 0xd1,
(byte) 0xaa,
(byte) 0x10,
(byte) 0x75,
(byte) 0x09,
(byte) 0xb0,
(byte) 0xb0,
(byte) 0xe7,
(byte) 0x26,
(byte) 0x52,
(byte) 0xf3,
(byte) 0x6d,
(byte) 0xec,
(byte) 0xc2,
(byte) 0xa6,
(byte) 0x48,
(byte) 0xd5,
(byte) 0x72,
(byte) 0x6b,
(byte) 0x51,
(byte) 0x1e,
(byte) 0x63,
(byte) 0x25,
(byte) 0xd0,
(byte) 0x16,
(byte) 0x13,
(byte) 0xa7,
(byte) 0xd0,
(byte) 0x5d,
(byte) 0x7f
},
// Priv
{
(byte) 0x7e,
(byte) 0x1f,
(byte) 0xd1,
(byte) 0x8c,
(byte) 0x54,
(byte) 0x52,
(byte) 0x83,
(byte) 0x04,
(byte) 0xa7,
(byte) 0xcb,
(byte) 0x10,
(byte) 0x18,
(byte) 0x20,
(byte) 0xcb,
(byte) 0x1a,
(byte) 0x61,
(byte) 0xe3,
(byte) 0x1f,
(byte) 0x40,
(byte) 0xfd,
(byte) 0x77,
(byte) 0xd4,
(byte) 0xfe,
(byte) 0x1b,
(byte) 0x4f,
(byte) 0x74,
(byte) 0xa0,
(byte) 0x5d,
(byte) 0x1d,
(byte) 0x2b,
(byte) 0x6b,
(byte) 0x85,
(byte) 0x58,
(byte) 0x67,
(byte) 0x22,
(byte) 0xa7,
(byte) 0x10,
(byte) 0xb4,
(byte) 0x99,
(byte) 0x87,
(byte) 0x8d,
(byte) 0x3f,
(byte) 0xd9,
(byte) 0xfb,
(byte) 0xba,
(byte) 0xe3,
(byte) 0x45,
(byte) 0x58
}
};
private static final byte[][] ECDSAKEY_521 = {
// pubX
{
(byte) 0x01,
(byte) 0xf0,
(byte) 0xb3,
(byte) 0x4f,
(byte) 0x92,
(byte) 0x73,
(byte) 0x0e,
(byte) 0x18,
(byte) 0x80,
(byte) 0x56,
(byte) 0x70,
(byte) 0xa5,
(byte) 0x4f,
(byte) 0x74,
(byte) 0x2e,
(byte) 0xa0,
(byte) 0x56,
(byte) 0xf2,
(byte) 0x67,
(byte) 0x25,
(byte) 0x93,
(byte) 0x08,
(byte) 0x19,
(byte) 0x37,
(byte) 0xed,
(byte) 0x45,
(byte) 0xa2,
(byte) 0x53,
(byte) 0x6e,
(byte) 0x74,
(byte) 0x50,
(byte) 0x95,
(byte) 0x46,
(byte) 0x2a,
(byte) 0x46,
(byte) 0x75,
(byte) 0x96,
(byte) 0x76,
(byte) 0x92,
(byte) 0xc2,
(byte) 0xe2,
(byte) 0xfa,
(byte) 0xce,
(byte) 0xa4,
(byte) 0x19,
(byte) 0x81,
(byte) 0x62,
(byte) 0xee,
(byte) 0x69,
(byte) 0xb6,
(byte) 0xa5,
(byte) 0xf2,
(byte) 0x81,
(byte) 0x22,
(byte) 0x6e,
(byte) 0x8f,
(byte) 0x12,
(byte) 0x3d,
(byte) 0x6b,
(byte) 0x82,
(byte) 0x17,
(byte) 0xb3,
(byte) 0x3f,
(byte) 0xa5,
(byte) 0xf0,
(byte) 0xdc
},
// pubY
{
(byte) 0x01,
(byte) 0xdd,
(byte) 0x63,
(byte) 0x19,
(byte) 0x2c,
(byte) 0x1d,
(byte) 0xe4,
(byte) 0xaa,
(byte) 0xc3,
(byte) 0x39,
(byte) 0x74,
(byte) 0xd9,
(byte) 0xf3,
(byte) 0x69,
(byte) 0x29,
(byte) 0x20,
(byte) 0x07,
(byte) 0x0f,
(byte) 0x1e,
(byte) 0x82,
(byte) 0xbc,
(byte) 0xc5,
(byte) 0x46,
(byte) 0xa9,
(byte) 0x5b,
(byte) 0x83,
(byte) 0x8e,
(byte) 0xd3,
(byte) 0x5b,
(byte) 0x3e,
(byte) 0xa2,
(byte) 0x3b,
(byte) 0x63,
(byte) 0x86,
(byte) 0xf9,
(byte) 0xe4,
(byte) 0x4a,
(byte) 0x47,
(byte) 0xb7,
(byte) 0xf8,
(byte) 0x30,
(byte) 0x70,
(byte) 0xb0,
(byte) 0xee,
(byte) 0xda,
(byte) 0xd0,
(byte) 0x43,
(byte) 0x22,
(byte) 0xb3,
(byte) 0xec,
(byte) 0xa8,
(byte) 0xf9,
(byte) 0xe9,
(byte) 0x1b,
(byte) 0x52,
(byte) 0xa2,
(byte) 0xcb,
(byte) 0xe0,
(byte) 0x05,
(byte) 0x08,
(byte) 0x3b,
(byte) 0x20,
(byte) 0x27,
(byte) 0x80,
(byte) 0xe9,
(byte) 0x6d
},
// Priv
{
(byte) 0x00,
(byte) 0xe9,
(byte) 0x3a,
(byte) 0xba,
(byte) 0xf5,
(byte) 0x66,
(byte) 0x69,
(byte) 0x34,
(byte) 0x6d,
(byte) 0x37,
(byte) 0x9a,
(byte) 0xdd,
(byte) 0xf1,
(byte) 0x91,
(byte) 0xf0,
(byte) 0x40,
(byte) 0x9e,
(byte) 0x89,
(byte) 0x08,
(byte) 0x5e,
(byte) 0xc9,
(byte) 0x16,
(byte) 0xb6,
(byte) 0x03,
(byte) 0x08,
(byte) 0xb9,
(byte) 0x00,
(byte) 0x48,
(byte) 0x62,
(byte) 0xa8,
(byte) 0xe4,
(byte) 0xe8,
(byte) 0x97,
(byte) 0x28,
(byte) 0x17,
(byte) 0x31,
(byte) 0x9d,
(byte) 0xa2,
(byte) 0xcb,
(byte) 0xc1,
(byte) 0x7f,
(byte) 0xfb,
(byte) 0x19,
(byte) 0x24,
(byte) 0xfd,
(byte) 0x75,
(byte) 0x7b,
(byte) 0x91,
(byte) 0xbd,
(byte) 0xa1,
(byte) 0x5b,
(byte) 0x9a,
(byte) 0x2a,
(byte) 0x93,
(byte) 0xeb,
(byte) 0x82,
(byte) 0x4d,
(byte) 0x0f,
(byte) 0xe6,
(byte) 0x2f,
(byte) 0x4b,
(byte) 0xeb,
(byte) 0xfc,
(byte) 0x4a,
(byte) 0xa9,
(byte) 0x6c
}
};
private static Object[] parametersPssValid() {
return new Object[] {
new Object[] {Enums.HashType.SHA256, Enums.HashType.SHA256, 2048, 32},
new Object[] {Enums.HashType.SHA256, Enums.HashType.SHA256, 3072, 32},
new Object[] {Enums.HashType.SHA256, Enums.HashType.SHA256, 4096, 32},
new Object[] {Enums.HashType.SHA384, Enums.HashType.SHA384, 2048, 48},
new Object[] {Enums.HashType.SHA384, Enums.HashType.SHA384, 3072, 48},
new Object[] {Enums.HashType.SHA384, Enums.HashType.SHA384, 4096, 48},
new Object[] {Enums.HashType.SHA512, Enums.HashType.SHA512, 2048, 64},
new Object[] {Enums.HashType.SHA512, Enums.HashType.SHA512, 3072, 64},
new Object[] {Enums.HashType.SHA512, Enums.HashType.SHA512, 4096, 64},
};
}
private static Object[] parametersPssInvalid() {
return new Object[] {
new Object[] {Enums.HashType.SHA256, Enums.HashType.SHA256, 2047, 32},
new Object[] {Enums.HashType.SHA384, Enums.HashType.SHA384, 2047, 48},
new Object[] {Enums.HashType.SHA512, Enums.HashType.SHA512, 2047, 64},
};
}
private static Object[] parametersPkcs1Valid() {
return new Object[] {
new Object[] {Enums.HashType.SHA256, 2048},
new Object[] {Enums.HashType.SHA256, 3072},
new Object[] {Enums.HashType.SHA256, 4096},
new Object[] {Enums.HashType.SHA384, 2048},
new Object[] {Enums.HashType.SHA384, 3072},
new Object[] {Enums.HashType.SHA384, 4096},
new Object[] {Enums.HashType.SHA512, 2048},
new Object[] {Enums.HashType.SHA512, 3072},
new Object[] {Enums.HashType.SHA512, 4096},
};
}
private static Object[] parametersPkcs1Invalid() {
return new Object[] {
new Object[] {Enums.HashType.SHA256, 2047},
new Object[] {Enums.HashType.SHA384, 2047},
new Object[] {Enums.HashType.SHA512, 2047},
};
}
public static final String[] getRsaKeyInfo(int keySize) throws Exception {
switch (keySize) {
case 2048:
return RSAKEY_2048;
case 3072:
return RSAKEY_3072;
case 4096:
default:
return RSAKEY_4096;
}
}
private final void createRsaKey(int bitLength) throws Exception {
String[] keyInfo = getRsaKeyInfo(bitLength);
KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
publicRsaKey =
(RSAPublicKey)
kf.generatePublic(
new RSAPublicKeySpec(
new BigInteger(keyInfo[0].substring(keyInfo[0].length() - (bitLength / 4)), 16),
BigInteger.valueOf(65537)));
privateRsaKey =
(RSAPrivateCrtKey)
kf.generatePrivate(
new RSAPrivateCrtKeySpec(
new BigInteger(keyInfo[0], 16),
BigInteger.valueOf(65537),
new BigInteger(keyInfo[1], 16),
new BigInteger(keyInfo[2], 16),
new BigInteger(keyInfo[3], 16),
new BigInteger(keyInfo[4], 16),
new BigInteger(keyInfo[5], 16),
new BigInteger(keyInfo[6], 16)));
}
@Test
@Parameters(method = "parametersPssValid")
public void testValidateRsaSsaPssValid(
Enums.HashType sigHash, Enums.HashType mgf1Hash, int bitLength, int saltLength)
throws Exception {
createRsaKey(bitLength);
SelfKeyTestValidators.validateRsaSsaPss(
privateRsaKey, publicRsaKey, sigHash, mgf1Hash, saltLength);
}
@Test
@Parameters(method = "parametersPssInvalid")
public void testValidateRsaSsaPssInvalid(
Enums.HashType sigHash, Enums.HashType mgf1Hash, int bitLength, int saltLength)
throws Exception {
createRsaKey(bitLength);
assertThrows(
Exception.class,
() ->
SelfKeyTestValidators.validateRsaSsaPss(
privateRsaKey, publicRsaKey, sigHash, mgf1Hash, saltLength));
}
@Test
@Parameters(method = "parametersPkcs1Valid")
public void testValidateRsaSsaPkcs1Valid(Enums.HashType sigHash, int bitLength) throws Exception {
createRsaKey(bitLength);
SelfKeyTestValidators.validateRsaSsaPkcs1(privateRsaKey, publicRsaKey, sigHash);
}
@Test
@Parameters(method = "parametersPkcs1Invalid")
public void testValidateRsaSsaPkcs1Invalid(Enums.HashType sigHash, int bitLength)
throws Exception {
createRsaKey(bitLength);
assertThrows(
Exception.class,
() -> SelfKeyTestValidators.validateRsaSsaPkcs1(privateRsaKey, publicRsaKey, sigHash));
}
private static Object[] parametersEcdsaValid() {
return new Object[] {
new Object[] {Enums.HashType.SHA256, EllipticCurves.CurveType.NIST_P256},
new Object[] {Enums.HashType.SHA384, EllipticCurves.CurveType.NIST_P384},
new Object[] {Enums.HashType.SHA512, EllipticCurves.CurveType.NIST_P521},
};
}
public static final byte[][] getEcdsaKeyInfo(EllipticCurves.CurveType curveType)
throws Exception {
switch (curveType) {
case NIST_P256:
return ECDSAKEY_256;
case NIST_P384:
return ECDSAKEY_384;
case NIST_P521:
return ECDSAKEY_521;
}
throw new Exception("invalid curve. Should never happen.");
}
private final void createEcdsaKey(EllipticCurves.CurveType curveType) throws Exception {
byte[][] key = getEcdsaKeyInfo(curveType);
publicEcdsaKey = EllipticCurves.getEcPublicKey(curveType, key[0], key[1]);
privateEcdsaKey = EllipticCurves.getEcPrivateKey(curveType, key[2]);
}
@Test
@Parameters(method = "parametersEcdsaValid")
public void testValidateEcdsaValid(Enums.HashType hash, EllipticCurves.CurveType curveType)
throws Exception {
createEcdsaKey(curveType);
SelfKeyTestValidators.validateEcdsa(
privateEcdsaKey, publicEcdsaKey, hash, EllipticCurves.EcdsaEncoding.IEEE_P1363);
}
}