fix: helper utils

This commit is contained in:
ayman
2024-12-28 10:30:40 +05:30
parent 3135a407cc
commit 5e90bd988a
15 changed files with 259 additions and 120 deletions

View File

@@ -39,6 +39,8 @@ export const MAX_PADDED_ECONTENT_LEN: Partial<
ecdsa_sha384_secp384r1_384: 512,
rsa_sha256_65537_3072: 384,
rsa_sha256_3_2048: 384,
ecdsa_sha256_brainpoolP256r1_256: 384,
ecdsa_sha384_brainpoolP384r1_384: 512,
};
export const MAX_PADDED_SIGNED_ATTR_LEN: Partial<
@@ -54,9 +56,11 @@ export const MAX_PADDED_SIGNED_ATTR_LEN: Partial<
rsapss_sha384_65537_3072: 256,
ecdsa_sha1_secp256r1_256: 192,
ecdsa_sha256_secp256r1_256: 192,
ecdsa_sha384_secp384r1_384: 192,
ecdsa_sha384_secp384r1_384: 256,
rsa_sha256_65537_3072: 192,
rsa_sha256_3_2048: 192,
ecdsa_sha256_brainpoolP256r1_256: 192,
ecdsa_sha384_brainpoolP384r1_384: 256,
};
export const MAX_CERT_BYTES: Partial<Record<keyof typeof SignatureAlgorithmIndex, number>> = {
@@ -98,7 +102,9 @@ export enum SignatureAlgorithmIndex {
rsapss_sha256_3_3072 = 16,
rsapss_sha256_3_4096 = 17,
rsapss_sha384_65537_3072 = 18,
rsapss_sha256_65537_3072 = 19
rsapss_sha256_65537_3072 = 19,
ecdsa_sha256_brainpoolP256r1_256 = 21,
ecdsa_sha384_brainpoolP384r1_384 = 22,
}
export const attributeToPosition = {
@@ -123,7 +129,7 @@ export const n_dsc = 64;
export const n_dsc_3072 = 96;
export const n_dsc_4096 = 64;
export const k_dsc = 32;
export const k_dsc_3072 = 32; //48;
export const k_dsc_3072 = 32; //48;
export const k_dsc_4096 = 64;
export const n_csca = 64;
export const k_csca = 64;

View File

@@ -460,9 +460,9 @@ gWumsjuDKbjOOuFdGUDURNtlREjxrnq/NGXVVnCyqsdo8JpZysABSf/eNs0D9o0w
w/h8qiuaZaVrlZ7Jjeo7ajGtQ06VNH89Uj6z/+QOlcntXy1Z8kHLj5uK5jgqhStZ
HSmnugxx7VOXBDVklCt1ONz8PwAa+0X0nGJNemoC3cunZqRlncBucjy7M7lrGeS+
iySrEW15LP1BIewmCV9GYliauC5xffKa+IfCJnm3zw==
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_dsc_key_sha256_rsapss_65537_3072=`-----BEGIN PRIVATE KEY-----
export const mock_dsc_key_sha256_rsapss_65537_3072 = `-----BEGIN PRIVATE KEY-----
MIIG/QIBADANBgkqhkiG9w0BAQEFAASCBucwggbjAgEAAoIBgQDjX/MuuvRWk0lP
5S2LjsvKcF6CFTfTgYtlTF6C/l/05cYluvmWGi5YjuYTYewTl2YOyKUOJqpLKIXx
PEn/U8aVP692nn83UAdaxoJI0YIHoURDe/cmXN0YdTysOsEpxrjyMuKPker//FGW
@@ -502,9 +502,9 @@ mb5trSbPl10irtAMkZPHduBf7bdws6+6285JP9utc6SWCRRHj9yl4O0MaURnGXdx
sNmBlVp81RaPf5NAbe38eRBtcAKG5V9nis45QefWOCJ4Dnm69HZ1H6ozVrzt4HQm
iI26TdrqkM7g7vzOS0gOEMI=
-----END PRIVATE KEY-----
`
`;
export const mock_dsc_sha256_rsapss_65537_3072=`-----BEGIN CERTIFICATE-----
export const mock_dsc_sha256_rsapss_65537_3072 = `-----BEGIN CERTIFICATE-----
MIIEwjCCAvagAwIBAgIUZflxS6VTZ+x2jttEfGIaE/bBrSAwQQYJKoZIhvcNAQEK
MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF
AKIDAgEgMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
@@ -531,7 +531,7 @@ NuZ46gmB8zMj2UewCVzaJ7RFXfvejbGccwtpLRy7BBBVO5ZRWh79BsWEq0HSLtBa
KpveLtZpGLwRHMAVhWftT70J3lzrE3OcGWcGV8Ubdx0Cv1/c6ikShLnEEwwV4BoQ
sDghA5MyF+3oxZc3/gyhaM/zvGgyeF8m3xhmlySPXstIOBONiX7jw7hq8uIu1ctN
0Kc3XOb+BAqHQvSCXISshZ1xreF/xg==
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_csca_key_rsapss_65537_4096 = `
-----BEGIN PRIVATE KEY-----
@@ -618,7 +618,7 @@ ONLHppLKnaF2G0+8K2m8SaYR0evVUHacQjKA/yNtlP+zpCm7Zw6E4bLHL+/p2CUO
l1g0QvM9uulWFQeQA3Ds5GGsc7WSztFQLe+Mw1wmfnaGvbCCZNGdfV91Gxbu+0Um
JOOn3mnc4Pgz8INvMIe7BkwquWZT5Dh/D3zHY2O2rFojioAVl1ibCxZkbX0q/BXh
qztITe2ZDOHrXoVJ1U//rqM0aSO5JcKRXk5E9VcWW5vQnVXX+3wr/P7l9ClN3w==
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_dsc_key_rsapss_65537_4096 = `-----BEGIN PRIVATE KEY-----
MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDUGaAQSOhZZQrL
@@ -672,7 +672,7 @@ odQlepVKCWIav4YuqA1i9TG2qCVjB379ERBOBoNJ0Q3C5bv6au2+TLQvH/R/e1ed
3XkgZ8ec+IU8tzJX7Zubg/cCSzESJsxdNzYUsBQwSEiVmrsKoJ5lK92CZxHGueIM
VIC18b9mdJu8A6U7N3q4AaFS0oBQ
-----END PRIVATE KEY-----
`
`;
export const mock_dsc_sha256_rsapss_65537_4096 = `-----BEGIN CERTIFICATE-----
MIIFwjCCA3agAwIBAgIUegbEJKS0EoxaWTW81zA0wSo1q/4wQQYJKoZIhvcNAQEK
@@ -706,7 +706,7 @@ LY4bleprE+8yX+MPkjjPD4o/NwNPSkjXQJVOxOglPOG7Eh4lPglR/O8eIZ+NZnWD
vsEOVqs7EZdPW8h08ic1EGjJCQB/tfFJ/vzP0CfOLhhnokAA81+4rMiGHPv7+fi3
nb03Vb90cletIyOwobD8mufnYD0ua3c4id0WopafR4MF91zr7CXEuvQVcOYfZKY/
0LemzFv4pbb+9t44QS3w0OmvENW8ZLRzjzXoSniHqqLlAJ7OmTY=
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_csca_sha384_rsapss_65537_3072 = `
-----BEGIN CERTIFICATE-----
@@ -776,7 +776,7 @@ fQyrSx5WCO04wbRsEQbHwtdq7QGcegyaWich/u3AIrypMyd4wAaBXxS7jDThulM7
3G8+pRbRRBBdEiTK45RM7nahf0zA2qm2VIG16NtZTOUJZqK2AxQjnYxQWhC0X/FA
T5gGnl33WcF2FjfqwPwEUBkd+W7r8WKDGnTkBctyc1IyxIiOPIi3nIXPhQrJxA/R
AHThNL5pYxeq+tNRsvPYY90=
-----END PRIVATE KEY-----`
-----END PRIVATE KEY-----`;
export const mock_dsc_sha384_rsapss_65537_3072 = `-----BEGIN CERTIFICATE-----
MIIEwjCCAvagAwIBAgIUKp13XbOipd9/h7Vmx21KMC4I40swQQYJKoZIhvcNAQEK
@@ -806,7 +806,7 @@ niOQ/EOeQNP7BK//Gc9YJR8CM1uypZmw4MAoYRsllhE98wo5t7K+Yh3XbEIxZTSU
fs8LHRtGciln2kBjHJSRifhPFSXILGgEPRPvOMHgDHLzr7QFajskU3fv/MV2zqfS
10b7qUNrwvURph+aXyMiamRoVvp6KA==
-----END CERTIFICATE-----
`
`;
export const mock_csca_key_sha256_rsapss_3_4096 = `-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDydOy1SpmPOD/h
@@ -861,7 +861,7 @@ nilE+U/aKB+AmG3VM/pCGZ4KGpDU36SgDZ4nwFo2v0oSI2OITUSzFnROKxWelxkn
3/LoY/4aa+7GJHODW7R4G9oiQx8/Lg==
-----END PRIVATE KEY-----
`
`;
export const mock_csca_sha256_rsapss_3_4096 = `-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIUBLDEWBLHolBcAfAj5FihkI3d8ccwDQYJKoZIhvcNAQEL
@@ -893,7 +893,7 @@ RhR4lHe8WJpIUrHeFX7Zmo5r6FMP003zrm1uXVI8eSSAwUIsvLTxWMQfwrzxGB7J
lPxSG4KXuoMUvIsDxV8JctXzP5OOf1hY+boqd3n8YeMTWt1qA7TYsKJTsLBU2XO4
HYcuL8c7y01o/R4QfTlXcIofI0EV0yLRo/0/+ynScI43JgEruX5BpN5Kb0Q8rciN
zgPsBxvGQAcHf/j9vPuV9J7Ysm5Ek3mYiHVqkVii8nHwsts2xjDCPUGUc58H
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_dsc_key_sha256_rsapss_3_4096 = `-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDTP9+SF5DocOTe
@@ -947,7 +947,7 @@ aIVUaJC/GlP6Q7NQ2p/Zm0EGOjRiXK16dgosI5d/oAGTt5ozW1AqCpwxdVV0N8n0
yBJ4blAscsAp0eCKwrIW7bS3fG9eXQhtz+j0iY0tDAk9q98zgtr+/aSRcBsDUZVh
YB+6OfEWTqL61rgUMTbCi6YM5fJToQ==
-----END PRIVATE KEY-----
`
`;
export const mock_dsc_sha256_rsapss_3_4096 = `-----BEGIN CERTIFICATE-----
MIIFwDCCA3SgAwIBAgIUcesdYZnU43PcOUYu85A6aDs81QgwQQYJKoZIhvcNAQEK
@@ -981,7 +981,7 @@ J8NU7jxC7E9p7H+1JEuVkXRzgFRQoHtU5Q6URQ/xsn3/O2RCvMACj1iAOwSgBTSf
hurjlQ1ZjmsOSzcNrXXTLC1eW/ScH1BbUpB1oP3dcuxmkaZBlMUa7iEmXIF+g6av
xqQ2cg1zvTQnb+6nyQIWWAh8zgtvIpOGfaNiTDOZk5oJg/9ozav3BMcWdUQJurn4
mJ6SOQXqPh5uDUG5BwwumHzkITDaftCcO3BJba3GHCMhAXTZ
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_csca_key_sha256_rsapss_3_3072 = `-----BEGIN PRIVATE KEY-----
MIIG/gIBADANBgkqhkiG9w0BAQEFAASCBugwggbkAgEAAoIBgQDvXdX22QnHkizR
@@ -1022,7 +1022,7 @@ ZcEYXygdgdyqVt2zw04fzfcBUhGfGvQB+jjiVfNB6eqQqVadyeOiB76AAmgChUJD
QrDQmnMXAMmskUtcPDts5z59JmOQ0gYRTjf6IR+yz3QWGLFoTxMM6UNybO5VUoiF
c7n39jd3CSLDOeHAjOt4/13aVyElvKxMSDY9HgjYqlcuBkY/Z3NiDBVrq9BSDUIe
bY2vE1eZZKW5i7g3c6hQ3Zxw
-----END PRIVATE KEY-----`
-----END PRIVATE KEY-----`;
export const mock_csca_sha256_rsapss_3_3072 = `-----BEGIN CERTIFICATE-----
MIIEaTCCAtGgAwIBAgIULeDw7IsLsk6y9yqcAARrKm0qiOkwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
@@ -1048,7 +1048,7 @@ tfVk9Q7vZdBnckNSPQMWWUFmzYwzJrGMKA2Rugev2ZuFqoOVz528LK8p+NMQKfCO
kTtURp/t2fxEqFtIZo8x2LmGidAyoQzHHLBO7Dw1DgNBNgKdVmKkDI5BGirT8gSA
EBBq0cqKIavLC0jvyktLHDgB8OP+fM/cU9Rjmp5GCXjDERDSbp4EmQTGMEtrb4nz
483fjGfLkqBGAxsC7F9cjZMlTHDxFZXxWpoWM4o=
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_dsc_key_sha256_rsapss_3_3072 = `-----BEGIN PRIVATE KEY-----
MIIG/AIBADANBgkqhkiG9w0BAQEFAASCBuYwggbiAgEAAoIBgQCzn/sT6JxQCJn4
@@ -1089,7 +1089,7 @@ tWut/mKpQzH9OvLHU3cbAquZgdZUVPGsyJIdyGEg6ijmMF0C0lUMq938JILSxCXQ
WAdVlGg6nRMqEMdgUHcX/M9LCpH5HdRVR7vE1BZ+KBpHCrUBNnpKGjAB3BIE7Lx6
N++yqdDF4aI9k+D8l5YVh5+x0vF0o38TDwGjCRjV0RN3XSNh4T3rSds6kVZixYXS
/pE7Qvc1Voct0h8T4dQ0zA==
-----END PRIVATE KEY-----`
-----END PRIVATE KEY-----`;
export const mock_dsc_sha256_rsapss_3_3072 = `-----BEGIN CERTIFICATE-----
MIIEwDCCAvSgAwIBAgIUJ0ZUVWmsXZwHvjP+PmM4YQ5mEb4wQQYJKoZIhvcNAQEK
MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF
@@ -1117,7 +1117,7 @@ wpvVlQCy3DmQ6We1uJFRCcMn3Q+j5pj1YQJxmWjljyJPuF07g7m88npBuGcDnpxY
EIVsQptX3LYy5/0l+zZbkGr//soirv7HlQREN8lsSZtvBepkNyZafg9KasxynDbB
QSwFfauMiF/q99reqMmst0BCBe77lXb8/ParwbqayowiJmNjcSvJeTpVG3rz6nYK
ruZ86kNVDqbSZ6qZjjQoMrLvKQg=
-----END CERTIFICATE-----`
-----END CERTIFICATE-----`;
export const mock_dsc_sha256_rsapss_4096 = `-----BEGIN CERTIFICATE-----
MIIEXTCCAhGgAwIBAgIUdS5K/Y5Ty0C8hDFibjmvBeQr4SgwQQYJKoZIhvcNAQEK
@@ -1245,26 +1245,48 @@ d+9Msdsovrc=
`;
export const mock_dsc_key_sha256_brainpoolP256r1 = `-----BEGIN EC PRIVATE KEY-----
MHgCAQEEICM/qGkSEYZJeejSAl3to/52G9Vw+GDKdvw2BA4Hq4TRoAsGCSskAwMC
CAEBB6FEA0IABCga+ftPaAL6Bljws48myO1IDRDjaBkyFR3W/esrhP2pb3poTpqd
KDjKkI9hUU1t3cllGYBP4UzL9IUhe4J7I6s=
MHgCAQEEIGJigSc0XAA6G8o5znqeZyr6vM33jfVLKjIenqGZni8poAsGCSskAwMC
CAEBB6FEA0IABDu2bqyQM7+NJRN1jSaQK0DW2a99g2U6JjGGIVMq0n2gZYOKFx9E
SguAfoUpJmMXDsyPwTHlPtn/vLMfRzgbtPQ=
-----END EC PRIVATE KEY-----
`;
export const mock_dsc_sha256_brainpoolP256r1 = `-----BEGIN CERTIFICATE-----
MIICDzCCAbagAwIBAgIUcNlflnEgBabRuI8TtmhfuXeBDxAwCgYIKoZIzj0EAwIw
ZjELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRUw
EwYDVQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBFVuaXQxEjAQBgNVBAMMCW1v
Y2tfY3NjYTAeFw0yNDEwMDMxODE2MzFaFw0yNTEwMDMxODE2MzFaMGUxCzAJBgNV
BAYTAlVTMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UECgwM
T3JnYW5pemF0aW9uMQ0wCwYDVQQLDARVbml0MREwDwYDVQQDDAhtb2NrX2RzYzBa
MBQGByqGSM49AgEGCSskAwMCCAEBBwNCAARcehJ7rf3trDknfb3agrcH08G7q0lZ
GL6fpY3beLTxeJMFF36REb8HLnOUFGw78hfPH8etWuA9H7HVZ/vB8Cd8o0IwQDAd
BgNVHQ4EFgQUQE/6d9aMviaMEi9k91hdsVguoekwHwYDVR0jBBgwFoAUXOj0kKh6
5e3xwozKdrj0y/kxpVkwCgYIKoZIzj0EAwIDRwAwRAIgfcPQcDu6hK7ad5EM1Owf
hlAwf+ljOVwK1ZhDh5lJLicCIEJdrWnH+dUOBL+NecPbLmcFVBCelST9iNCUXTKD
CLpT
MIIB4DCCAYagAwIBAgIUbHVEhdtUOw6RyVe/hvzTuRzEuR4wCgYIKoZIzj0EAwIw
RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDEyMjcxMTU3NDNaFw0yNTEyMjcx
MTU3NDNaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwWjAUBgcqhkjOPQIBBgkrJAMD
AggBAQcDQgAEO7ZurJAzv40lE3WNJpArQNbZr32DZTomMYYhUyrSfaBlg4oXH0RK
C4B+hSkmYxcOzI/BMeU+2f+8sx9HOBu09KNTMFEwHQYDVR0OBBYEFP1eFopMfvFG
0FAMe9ufMERzT7I7MB8GA1UdIwQYMBaAFP1eFopMfvFG0FAMe9ufMERzT7I7MA8G
A1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKMCAoCHlvYyR9nuUXWS
Tvkpy9dRVAEaF2QmoiMtCHKnAiAe9FkZw6iO8h4GWKyeiAsvnk/tiRcLwkOQoLNc
7hTFLQ==
-----END CERTIFICATE-----
`;
export const mock_dsc_key_sha384_brainpoolP384r1 = `-----BEGIN EC PRIVATE KEY-----
MIGoAgEBBDAAqX21j3nsvbpheKxpL3Vbj9Q5rkMqZ1LTVOpykpFezXH8R+d9tYgl
lMBGmlszFJSgCwYJKyQDAwIIAQELoWQDYgAEf0p2YN3Lru5iZ8KRhZfUthvwBa9u
SZgsKlmeBE7epzdpJvkGL3QSHO2GiF7Nv8MYEerqpwyynlAL9YK8HAqAXOoOa+rP
RvG+mFXRYyRZTMwIH5/ULI29H+tLqsRejx4x
-----END EC PRIVATE KEY-----
`;
export const mock_dsc_sha384_brainpoolP384r1 = `-----BEGIN CERTIFICATE-----
MIICHzCCAaagAwIBAgIUIWM2gNwyhyOd0Tv2h8Hm63b/s54wCgYIKoZIzj0EAwMw
RTELMAkGA1UEBhMCSU4xEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDEyMjcwOTQzMjBaFw0yNTEyMjcw
OTQzMjBaMEUxCzAJBgNVBAYTAklOMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwejAUBgcqhkjOPQIBBgkrJAMD
AggBAQsDYgAEf0p2YN3Lru5iZ8KRhZfUthvwBa9uSZgsKlmeBE7epzdpJvkGL3QS
HO2GiF7Nv8MYEerqpwyynlAL9YK8HAqAXOoOa+rPRvG+mFXRYyRZTMwIH5/ULI29
H+tLqsRejx4xo1MwUTAdBgNVHQ4EFgQUpCaQbwuQL/GaEmjSH4oVu8zku44wHwYD
VR0jBBgwFoAUpCaQbwuQL/GaEmjSH4oVu8zku44wDwYDVR0TAQH/BAUwAwEB/zAK
BggqhkjOPQQDAwNnADBkAjArBhymHpn9modIUw0Q/t3wxyzGYO9UpuiAxJiiRWVM
SduwTA4zUXYzfQUEn50j4lQCMHbwK7l1rwHW0FlpAMG3GDFgTNUaCU2I/m3J4A/E
bKeq3jWgsSb2o7VSgneDGG70Qw==
-----END CERTIFICATE-----
`;

View File

@@ -99,10 +99,32 @@ export function getNamedCurve(oid: string): string {
'1.2.840.10045.3.1.7': 'secp256r1',
'1.3.132.0.34': 'secp384r1',
'1.3.132.0.35': 'secp521r1',
'1.3.36.3.3.2.8.1.1.7': 'brainpoolP256r1',
'1.3.36.3.3.2.8.1.1.11': 'brainpoolP384r1',
// Add more curve OIDs as needed
};
return curves[oid] || `Unknown (${oid})`;
if (!curves[oid]) {
throw new Error('Invalid curve: ' + oid);
}
return curves[oid];
}
export function getCurveForElliptic(curveName: string): string {
const curves = {
secp256r1: 'p256',
secp384r1: 'p384',
secp521r1: 'p521',
brainpoolP256r1: 'brainpoolP256r1',
brainpoolP384r1: 'brainpoolP384r1',
};
if (!curves[curveName]) {
throw new Error('Invalid curve: ' + curveName);
}
return curves[curveName];
}
export function getECDSACurveBits(curveName: string): string {
const curveBits: { [key: string]: number } = {
secp256r1: 256,

View File

@@ -59,7 +59,7 @@ export function parseCertificate(pem: string) {
}
export const getCircuitName = (
circuitMode: "prove" | "dsc" | "vc_and_disclose",
circuitMode: 'prove' | 'dsc' | 'vc_and_disclose',
signatureAlgorithm: string,
hashFunction: string,
domainParameter: string,
@@ -94,20 +94,20 @@ export const getCircuitName = (
keyLength
);
};
export const getCircuitNameOld = (circuitMode: Mode, signatureAlgorithm: string, hashFunction: string) => {
export const getCircuitNameOld = (
circuitMode: Mode,
signatureAlgorithm: string,
hashFunction: string
) => {
const circuit = circuitNameFromMode[circuitMode];
if (circuit == 'vc_and_disclose') {
return 'vc_and_disclose';
} else if (signatureAlgorithm === 'ecdsa') {
return circuit + '_' + signatureAlgorithm + '_secp256r1_' + hashFunction;
} else {
return circuit + '_' + signatureAlgorithm + '_65537_' + hashFunction;
}
else if (signatureAlgorithm === 'ecdsa') {
return circuit + "_" + signatureAlgorithm + "_secp256r1_" + hashFunction;
}
else {
return circuit + "_" + signatureAlgorithm + "_65537_" + hashFunction;
}
}
};
export function getSignatureAlgorithmDetails(oid: string): {
signatureAlgorithm: string;

View File

@@ -6,10 +6,65 @@ import {
PublicKeyDetailsRSA,
PublicKeyDetailsRSAPSS,
} from './dataStructure';
import { identifyCurve, StandardCurve, getNamedCurve, getECDSACurveBits } from './curves';
import {
identifyCurve,
StandardCurve,
getNamedCurve,
getECDSACurveBits,
getCurveForElliptic,
} from './curves';
import { gethashFunctionName } from './handleCertificate';
import elliptic from 'elliptic';
const curves = elliptic.curves;
const PresetCurve = elliptic.curves.PresetCurve;
function defineCurve(name, options) {
Object.defineProperty(curves, name, {
configurable: true,
enumerable: true,
get: function () {
var curve = new PresetCurve(options);
Object.defineProperty(curves, name, {
configurable: true,
enumerable: true,
value: curve,
});
return curve;
},
});
}
defineCurve('brainpoolP256r1', {
type: 'short',
prime: null,
p: 'a9fb57db a1eea9bc 3e660a90 9d838d72 6e3bf623 d5262028 2013481d 1f6e5377',
a: '7d5a0975 fc2c3057 eef67530 417affe7 fb8055c1 26dc5c6c e94a4b44 f330b5d9',
b: '26dc5c6c e94a4b44 f330b5d9 bbd77cbf 95841629 5cf7e1ce 6bccdc18 ff8c07b6',
n: 'a9fb57db a1eea9bc 3e660a90 9d838d71 8c397aa3 b561a6f7 901e0e82 974856a7',
hash: curves.p256.hash,
gRed: false,
g: [
'8bd2aeb9 cb7e57cb 2c4b482f fc81b7af b9de27e1 e3bd23c2 3a4453bd 9ace3262',
'547ef835 c3dac4fd 97f8461a 14611dc9 c2774513 2ded8e54 5c1d54c7 2f046997',
],
});
defineCurve('brainpoolP384r1', {
type: 'short',
prime: null,
p: '8cb91e82 a3386d28 0f5d6f7e 50e641df 152f7109 ed5456b4 12b1da19 7fb71123 acd3a729 901d1a71 87470013 3107ec53',
a: '7bc382c6 3d8c150c 3c72080a ce05afa0 c2bea28e 4fb22787 139165ef ba91f90f 8aa5814a 503ad4eb 04a8c7dd 22ce2826',
b: '04a8c7dd 22ce2826 8b39b554 16f0447c 2fb77de1 07dcd2a6 2e880ea5 3eeb62d5 7cb43902 95dbc994 3ab78696 fa504c11',
n: '8cb91e82 a3386d28 0f5d6f7e 50e641df 152f7109 ed5456b3 1f166e6c ac0425a7 cf3ab6af 6b7fc310 3b883202 e9046565',
hash: curves.p384.hash,
gRed: false,
g: [
'1d1c64f0 68cf45ff a2a63a81 b7c13f6b 8847a3e7 7ef14fe3 db7fcafe 0cbd10e8 e826e034 36d646aa ef87b2e2 47d4af1e',
'8abe1d75 20f9c2a4 5cb1eb8e 95cfd552 62b70b29 feec5864 e19c054f f9912928 0e464621 77918111 42820341 263c5315',
],
});
export function parseRsaPublicKey(subjectPublicKeyInfo: any): PublicKeyDetailsRSA {
const publicKey = subjectPublicKeyInfo.subjectPublicKey;
const asn1PublicKey = fromBER(publicKey.valueBlock.valueHexView);
@@ -53,7 +108,7 @@ export function parseECParameters(publicKeyInfo: any): PublicKeyDetailsECDSA {
const curve = getNamedCurve(curveOid);
const publicKeyBuffer = publicKeyInfo.subjectPublicKey.valueBlock.valueHexView;
const curveForElliptic = curve === 'secp256r1' ? 'p256' : 'p384';
const curveForElliptic = getCurveForElliptic(curve);
const ec = new elliptic.ec(curveForElliptic);
const key = ec.keyFromPublic(publicKeyBuffer);
const x = key.getPublic().getX().toString('hex');
@@ -61,6 +116,8 @@ export function parseECParameters(publicKeyInfo: any): PublicKeyDetailsECDSA {
const fieldSizeMap: { [key: string]: number } = {
secp256r1: 256,
secp384r1: 384,
brainpoolP256r1: 256,
brainpoolP384r1: 384,
};
const bits = fieldSizeMap[curve];

View File

@@ -34,11 +34,15 @@ import {
mock_dsc_sha256_rsapss_65537_3072,
mock_dsc_key_rsapss_65537_4096,
mock_dsc_sha256_rsapss_65537_4096,
mock_dsc_key_sha384_brainpoolP384r1,
mock_dsc_sha384_brainpoolP384r1,
} from '../constants/mockCertificates';
import { sampleDataHashes_small, sampleDataHashes_large } from '../constants/sampleDataHashes';
import { countryCodes } from '../constants/constants';
import { parseCertificate } from './certificates/handleCertificate';
import { SignatureAlgorithm } from './types';
import { randomBytes } from 'crypto';
import { getCurveForElliptic } from './certificates/curves';
export function genMockPassportData(
signatureType: SignatureAlgorithm,
nationality: keyof typeof countryCodes,
@@ -93,75 +97,80 @@ export function genMockPassportData(
switch (signatureType) {
case 'rsa_sha1_65537_2048':
sampleDataHashes = sampleDataHashes_small;
sampleDataHashes = genSampleDataHashes('small', 20);
privateKeyPem = mock_dsc_key_sha1_rsa_4096;
dsc = mock_dsc_sha1_rsa_4096;
break;
case 'rsa_sha256_65537_2048':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsa_4096;
dsc = mock_dsc_sha256_rsa_4096;
break;
case 'rsapss_sha256_65537_2048':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsapss_4096;
dsc = mock_dsc_sha256_rsapss_4096;
break;
case 'rsapss_sha256_3_4096':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsapss_3_4096;
dsc = mock_dsc_sha256_rsapss_3_4096;
break;
case 'rsapss_sha256_3_3072':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsapss_3_3072;
dsc = mock_dsc_sha256_rsapss_3_3072;
break;
case 'rsapss_sha384_65537_3072':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha384_rsapss_65537_3072;
dsc = mock_dsc_sha384_rsapss_65537_3072;
break;
case 'ecdsa_sha256_secp256r1_256':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_ecdsa;
dsc = mock_dsc_sha256_ecdsa;
break;
case 'ecdsa_sha1_secp256r1_256':
sampleDataHashes = sampleDataHashes_small;
sampleDataHashes = genSampleDataHashes('small', 20);
privateKeyPem = mock_dsc_key_sha1_ecdsa;
dsc = mock_dsc_sha1_ecdsa;
break;
case 'ecdsa_sha384_secp384r1_384':
sampleDataHashes = sampleDataHashes_small;
sampleDataHashes = genSampleDataHashes('large', 48);
privateKeyPem = mock_dsc_key_sha384_ecdsa;
dsc = mock_dsc_sha384_ecdsa;
break;
case 'ecdsa_sha256_brainpoolP256r1_256':
sampleDataHashes = sampleDataHashes_small;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_brainpoolP256r1;
dsc = mock_dsc_sha256_brainpoolP256r1;
break;
case 'rsa_sha256_3_2048':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsa_3_2048;
dsc = mock_dsc_sha256_rsa_3_2048;
break;
case 'rsa_sha256_65537_3072':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsa_65537_3072;
dsc = mock_dsc_sha256_rsa_65537_3072;
break;
case 'rsapss_sha256_65537_3072':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_sha256_rsapss_65537_3072;
dsc = mock_dsc_sha256_rsapss_65537_3072;
break;
case 'rsapss_sha256_65537_4096':
sampleDataHashes = sampleDataHashes_large;
sampleDataHashes = genSampleDataHashes('large', 32);
privateKeyPem = mock_dsc_key_rsapss_65537_4096;
dsc = mock_dsc_sha256_rsapss_65537_4096;
break;
case 'ecdsa_sha384_brainpoolP384r1_384':
sampleDataHashes = genSampleDataHashes('large', 48);
privateKeyPem = mock_dsc_key_sha384_brainpoolP384r1;
dsc = mock_dsc_sha384_brainpoolP384r1;
break;
}
const { hashFunction, hashLen } = parseCertificate(dsc);
@@ -190,6 +199,14 @@ export function genMockPassportData(
};
}
const genSampleDataHashes = (
type: 'small' | 'large',
bytes: 20 | 32 | 48 | 64
): [number, number[]][] => {
const groups = type === 'small' ? [2, 3, 14] : [2, 3, 11, 12, 13, 14];
return groups.map((group) => [group, Array.from(randomBytes(bytes))]);
};
function sign(privateKeyPem: string, dsc: string, eContent: number[]): number[] {
const { signatureAlgorithm, hashFunction, curve } = parseCertificate(dsc);
@@ -205,7 +222,7 @@ function sign(privateKeyPem: string, dsc: string, eContent: number[]): number[]
const signatureBytes = privateKey.sign(md, pss);
return Array.from(signatureBytes, (c: string) => c.charCodeAt(0));
} else if (signatureAlgorithm === 'ecdsa') {
const curveForElliptic = curve === 'secp256r1' ? 'p256' : 'p384';
let curveForElliptic = getCurveForElliptic(curve);
const ec = new elliptic.ec(curveForElliptic);
const privateKeyDer = Buffer.from(
@@ -216,9 +233,9 @@ function sign(privateKeyPem: string, dsc: string, eContent: number[]): number[]
const privateKeyBuffer = (asn1Data.result.valueBlock as any).value[1].valueBlock.valueHexView;
const keyPair = ec.keyFromPrivate(privateKeyBuffer);
const md = hashFunction === 'sha1' ? forge.md.sha1.create() : forge.md.sha256.create();
let md = forge.md[hashFunction].create();
md.update(forge.util.binary.raw.encode(new Uint8Array(eContent)));
const signature = keyPair.sign(md.digest().toHex(), 'hex');
const signatureBytes = Array.from(Buffer.from(signature.toDER(), 'hex'));

View File

@@ -4,8 +4,8 @@ import {
MAX_PADDED_ECONTENT_LEN,
MAX_PADDED_SIGNED_ATTR_LEN,
} from '../constants/constants';
import { assert, shaPad } from './shaPad';
import { PassportData } from './types';
import { assert, sha384_512Pad, shaPad } from './shaPad';
import { PassportData, SignatureAlgorithm } from './types';
import {
bytesToBigDecimal,
formatMrz,
@@ -188,7 +188,9 @@ export function generateCircuitInputsProve(
let pubKey: any;
let signature: any;
const { n, k } = getNAndK(`${signatureAlgorithm}_${hashFunction}_${curve || exponent}_${bits}` as any);
const { n, k } = getNAndK(
`${signatureAlgorithm}_${hashFunction}_${curve || exponent}_${bits}` as SignatureAlgorithm
);
if (signatureAlgorithm === 'ecdsa') {
const { r, s } = extractRSFromSignature(encryptedDigest);
@@ -224,12 +226,16 @@ export function generateCircuitInputsProve(
);
}
const [eContentPadded, eContentLen] = shaPad(
console.log('hashFunction', hashFunction);
const paddingFunction =
hashFunction == 'sha1' || hashFunction == 'sha256' ? shaPad : sha384_512Pad;
const [eContentPadded, eContentLen] = paddingFunction(
new Uint8Array(eContent),
MAX_PADDED_ECONTENT_LEN[signatureAlgorithmFullName]
);
const [signedAttrPadded, signedAttrPaddedLen] = shaPad(
const [signedAttrPadded, signedAttrPaddedLen] = paddingFunction(
new Uint8Array(signedAttr),
MAX_PADDED_SIGNED_ATTR_LEN[signatureAlgorithmFullName]
);
@@ -246,8 +252,6 @@ export function generateCircuitInputsProve(
siblings: smt_siblings,
} = generateSMTProof(name_smt, name_leaf);
const dummy = 0;
return {
selector_mode: formatInput(selector_mode),
dg1: formatInput(formattedMrz),
@@ -272,7 +276,7 @@ export function generateCircuitInputsProve(
smt_leaf_value: formatInput(smt_leaf_value),
smt_siblings: formatInput(smt_siblings),
selector_ofac: formatInput(selector_ofac),
forbidden_countries_list: formatInput(formatCountriesList(forbidden_countries_list))
forbidden_countries_list: formatInput(formatCountriesList(forbidden_countries_list)),
};
}

View File

@@ -31,7 +31,6 @@ export function getLeaf(dsc: string): string {
const { signatureAlgorithm, hashFunction, modulus, x, y, bits, curve, exponent } =
parseCertificate(dsc);
const { n, k } = getNAndK(signatureAlgorithm);
console.log(`${signatureAlgorithm}_${hashFunction}_${curve || exponent}_${bits}`);
const sigAlgKey = `${signatureAlgorithm}_${hashFunction}_${curve || exponent}_${bits}`;
const sigAlgIndex = SignatureAlgorithmIndex[sigAlgKey];

View File

@@ -21,39 +21,42 @@ export function shaPad(prehash_prepad_m: Uint8Array, maxShaBytes: number): [Uint
return [prehash_prepad_m, messageLen];
}
export function sha384_512Pad(prehash_prepad_m: Uint8Array, maxShaBytes: number): [Uint8Array, number] {
export function sha384_512Pad(
prehash_prepad_m: Uint8Array,
maxShaBytes: number
): [Uint8Array, number] {
// Length in bits before padding
let length_bits = prehash_prepad_m.length * 8;
// For SHA-384, length is stored in 128 bits (16 bytes)
let length_in_bytes = int128toBytes(length_bits);
// Add the 1 bit (as a byte with value 128)
prehash_prepad_m = mergeUInt8Arrays(prehash_prepad_m, int8toBytes(2 ** 7));
// Add padding zeros until total length is congruent to 896 mod 1024
while ((prehash_prepad_m.length * 8 + length_in_bytes.length * 8) % 1024 !== 0) {
prehash_prepad_m = mergeUInt8Arrays(prehash_prepad_m, int8toBytes(0));
}
// Append the length
prehash_prepad_m = mergeUInt8Arrays(prehash_prepad_m, length_in_bytes);
// Verify padding is correct (multiple of 1024 bits)
assert((prehash_prepad_m.length * 8) % 1024 === 0, "Padding did not complete properly!");
assert((prehash_prepad_m.length * 8) % 1024 === 0, 'Padding did not complete properly!');
let messageLen = prehash_prepad_m.length;
// Pad to max length if needed
while (prehash_prepad_m.length < maxShaBytes) {
prehash_prepad_m = mergeUInt8Arrays(prehash_prepad_m, int128toBytes(0));
}
assert(
prehash_prepad_m.length === maxShaBytes,
`Padding to max length did not complete properly! Your padded message is ${prehash_prepad_m.length} long but max is ${maxShaBytes}!`
);
return [prehash_prepad_m, messageLen];
}
@@ -61,12 +64,12 @@ export function sha384_512Pad(prehash_prepad_m: Uint8Array, maxShaBytes: number)
function int128toBytes(x: number): Uint8Array {
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer);
// Write high 64 bits
view.setBigUint64(0, BigInt(0), false);
// Write low 64 bits
view.setBigUint64(8, BigInt(x), false);
return new Uint8Array(buffer);
}

View File

@@ -13,23 +13,24 @@ export type PassportData = {
// Define the signature algorithm in "algorithm_hashfunction_domainPapameter_keyLength"
export type SignatureAlgorithm =
| 'rsa_sha1_65537_2048'
| 'rsa_sha256_65537_2048'
| 'rsapss_sha256_65537_2048'
| 'rsapss_sha256_3_4096'
| 'rsapss_sha256_3_3072'
| 'rsapss_sha384_65537_3072'
| 'rsapss_sha384_65537_4096'
| 'ecdsa_sha256_secp256r1_256'
| 'ecdsa_sha1_secp256r1_256'
| 'ecdsa_sha384_secp384r1_384'
| 'ecdsa_sha256_brainpoolP256r1_256'
| 'rsa_sha256_3_2048'
| 'rsa_sha256_65537_3072'
| 'rsa_sha256_65537_4096'
| 'rsa_sha512_65537_4096'
| 'rsapss_sha256_65537_3072'
| 'rsapss_sha256_65537_4096';
| 'rsa_sha1_65537_2048'
| 'rsa_sha256_65537_2048'
| 'rsapss_sha256_65537_2048'
| 'rsapss_sha256_3_4096'
| 'rsapss_sha256_3_3072'
| 'rsapss_sha384_65537_3072'
| 'rsapss_sha384_65537_4096'
| 'ecdsa_sha256_secp256r1_256'
| 'ecdsa_sha1_secp256r1_256'
| 'ecdsa_sha384_secp384r1_384'
| 'ecdsa_sha256_brainpoolP256r1_256'
| 'rsa_sha256_3_2048'
| 'rsa_sha256_65537_3072'
| 'rsa_sha256_65537_4096'
| 'rsa_sha512_65537_4096'
| 'rsapss_sha256_65537_3072'
| 'rsapss_sha256_65537_4096'
| 'ecdsa_sha384_brainpoolP384r1_384';
export type Proof = {
proof: {

View File

@@ -37,7 +37,15 @@ export function getNAndK(sigAlg: SignatureAlgorithm) {
}
if (sigAlg.startsWith('ecdsa_')) {
return { n: n_dsc_ecdsa, k: k_dsc_ecdsa }; // 256/32 = 8
if (sigAlg.endsWith('256')) {
return { n: n_dsc_ecdsa, k: 4 };
} else if (sigAlg.endsWith('384')) {
return { n: n_dsc_ecdsa, k: 6 };
} else if (sigAlg.endsWith('512')) {
return { n: n_dsc_ecdsa, k: 8 };
} else if (sigAlg.endsWith('521')) {
return { n: n_dsc_ecdsa, k: 16 };
}
}
if (sigAlg.startsWith('rsapss_')) {