Skip to content

Commit 1f63359

Browse files
committed
FEAT: load-PKIX function (as a part of the new mezz-crypt module)
1 parent 7dfe1af commit 1f63359

File tree

3 files changed

+280
-0
lines changed

3 files changed

+280
-0
lines changed

src/mezz/boot-files.r

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ REBOL [
4646
%mezz-help.r ; move dump-obj!
4747
%mezz-banner.r
4848
%mezz-colors.r
49+
%mezz-crypt.r
4950
%mezz-tail.r
5051
]
5152

src/mezz/mezz-crypt.r

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
REBOL [
2+
System: "REBOL [R3] Language Interpreter and Run-time Environment"
3+
Title: "REBOL 3 Mezzanine: Crypt"
4+
Author: "Oldes"
5+
Rights: "Copyright (C) 2018 Oldes. All rights reserved."
6+
License: "BSD-3"
7+
Test: %tests/units/mezz-crypt-test.r3
8+
]
9+
10+
import module [
11+
Title: "Cryptography related mezzanine functions"
12+
Name: Crypt-utils
13+
Version: 0.0.1
14+
Exports: [load-PKIX]
15+
][
16+
17+
;local helpers
18+
19+
ch_space: charset " ^-^/^M"
20+
ch_tag: exclude charset [#" " - #"~"] charset #":"
21+
ch_val: complement charset "\^/"
22+
ch_pretext: complement charset #"-"
23+
ch_base64: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" #"/" #"+" #"="]
24+
ch_label: charset [#"^(21)" - #"^(2C)" #"^(2E)" - #"^(7E)" #" "]
25+
26+
load-PKIX: function[
27+
"Loads PKIX Textual Encoded data (RFC 7468). Returns block! or binary!"
28+
input [string! binary!] "Data to load"
29+
/binary "Returns only debased binary"
30+
/local tag val base64-data label pre-text post-text
31+
][
32+
if binary? input [input: to-string input]
33+
34+
header: copy []
35+
36+
rl_label: [
37+
e: [
38+
"---- BEGIN " copy label any ch_label "----" |
39+
"-----BEGIN " copy label any ch_label "-----"
40+
] opt cr lf (trim/tail copy label)
41+
|
42+
some ch_pretext rl_label
43+
]
44+
45+
unless parse/all input [
46+
s: rl_label ( pre-text: copy/part s e )
47+
any [
48+
copy tag some ch_tag #":"
49+
s: [
50+
some ch_val "^/"
51+
|
52+
any [some ch_val "\^/"] some ch_val "^/"
53+
] e: (
54+
val: trim/head/tail copy/part s e
55+
replace/all val "\^/" ""
56+
if all [#"^"" = val/1 #"^"" = last val][
57+
remove back tail remove val
58+
]
59+
repend header reduce [tag val]
60+
)
61+
]
62+
copy base64-data some [ch_base64 | ch_space]
63+
[
64+
"---- END " label "----" |
65+
"-----END " label "-----"
66+
] any [cr | lf]
67+
copy post-text to end
68+
][ return none ]
69+
70+
either binary [
71+
try [debase base64-data]
72+
][
73+
compose/only [
74+
label: (trim/tail label)
75+
binary: (try [debase base64-data])
76+
header: (new-line/skip header true 2)
77+
pre-text: (trim/head/tail pre-text)
78+
post-text: (trim/head/tail post-text)
79+
]
80+
]
81+
]
82+
] ;- end of module

src/tests/units/mezz-crypt-test.r3

+197
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
Rebol [
2+
Title: "Rebol lexer test script"
3+
Author: "Olds"
4+
File: %lexer-test.red
5+
Tabs: 4
6+
]
7+
8+
do %../quick-test.r3
9+
10+
~~~start-file~~~ "Crypt mezzanine"
11+
12+
===start-group=== "Load-PKIX"
13+
14+
--test-- "Textual Encoding of Certificates"
15+
;@@ https://tools.ietf.org/html/rfc7468#section-5
16+
;this one also with possible explanatory text
17+
;@@ https://tools.ietf.org/html/rfc7468#section-5.2
18+
pkxi:
19+
{Subject: CN=Atlantis
20+
Issuer: CN=Atlantis
21+
Validity: from 7/9/2012 3:10:38 AM UTC to 7/9/2013 3:10:37 AM UTC
22+
-----BEGIN CERTIFICATE-----
23+
MIIBmTCCAUegAwIBAgIBKjAJBgUrDgMCHQUAMBMxETAPBgNVBAMTCEF0bGFudGlz
24+
MB4XDTEyMDcwOTAzMTAzOFoXDTEzMDcwOTAzMTAzN1owEzERMA8GA1UEAxMIQXRs
25+
YW50aXMwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAu+BXo+miabDIHHx+yquqzqNh
26+
Ryn/XtkJIIHVcYtHvIX+S1x5ErgMoHehycpoxbErZmVR4GCq1S2diNmRFZCRtQID
27+
AQABo4GJMIGGMAwGA1UdEwEB/wQCMAAwIAYDVR0EAQH/BBYwFDAOMAwGCisGAQQB
28+
gjcCARUDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDAzA1BgNVHQEE
29+
LjAsgBA0jOnSSuIHYmnVryHAdywMoRUwEzERMA8GA1UEAxMIQXRsYW50aXOCASow
30+
CQYFKw4DAh0FAANBAKi6HRBaNEL5R0n56nvfclQNaXiDT174uf+lojzA4lhVInc0
31+
ILwpnZ1izL4MlI9eCSHhVQBHEp2uQdXJB+d5Byg=
32+
-----END CERTIFICATE-----}
33+
--assert block? Load-PKIX pkxi
34+
--assert binary? Load-PKIX/binary pkxi
35+
36+
--test-- "Textual Encoding of Certificate Revocation Lists"
37+
;@@ https://tools.ietf.org/html/rfc7468#section-6
38+
pkxi:
39+
{-----BEGIN X509 CRL-----
40+
MIIB9DCCAV8CAQEwCwYJKoZIhvcNAQEFMIIBCDEXMBUGA1UEChMOVmVyaVNpZ24s
41+
IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxRjBEBgNVBAsT
42+
PXd3dy52ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9SUEEgSW5jb3JwLiBieSBSZWYu
43+
LExJQUIuTFREKGMpOTgxHjAcBgNVBAsTFVBlcnNvbmEgTm90IFZhbGlkYXRlZDEm
44+
MCQGA1UECxMdRGlnaXRhbCBJRCBDbGFzcyAxIC0gTmV0c2NhcGUxGDAWBgNVBAMU
45+
D1NpbW9uIEpvc2Vmc3NvbjEiMCAGCSqGSIb3DQEJARYTc2ltb25Aam9zZWZzc29u
46+
Lm9yZxcNMDYxMjI3MDgwMjM0WhcNMDcwMjA3MDgwMjM1WjAjMCECEC4QNwPfRoWd
47+
elUNpllhhTgXDTA2MTIyNzA4MDIzNFowCwYJKoZIhvcNAQEFA4GBAD0zX+J2hkcc
48+
Nbrq1Dn5IKL8nXLgPGcHv1I/le1MNo9t1ohGQxB5HnFUkRPAY82fR6Epor4aHgVy
49+
b+5y+neKN9Kn2mPF4iiun+a4o26CjJ0pArojCL1p8T0yyi9Xxvyc/ezaZ98HiIyP
50+
c3DGMNR+oUmSjKZ0jIhAYmeLxaPHfQwR
51+
-----END X509 CRL-----}
52+
--assert block? Load-PKIX pkxi
53+
--assert binary? Load-PKIX/binary pkxi
54+
55+
--test-- "Textual Encoding of PKCS #10 Certification Request Syntax"
56+
;@@ https://tools.ietf.org/html/rfc7468#section-7
57+
pkxi:
58+
{-----BEGIN CERTIFICATE REQUEST-----
59+
MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm
60+
c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG
61+
ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs+9/CM
62+
EOlSwVej77tj56kj9R/j9Q+LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY
63+
BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB/wQCMAAwDwYDVR0PAQH/
64+
BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM/ADA8
65+
AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsKnuwL5g/ftAY
66+
dEQc8B8jAcnuOrfU
67+
-----END CERTIFICATE REQUEST-----}
68+
--assert block? Load-PKIX pkxi
69+
--assert binary? Load-PKIX/binary pkxi
70+
71+
--test-- "Textual Encoding of PKCS #7 Cryptographic Message Syntax"
72+
;@@ https://tools.ietf.org/html/rfc7468#section-8
73+
pkxi:
74+
{-----BEGIN PKCS7-----
75+
MIHjBgsqhkiG9w0BCRABF6CB0zCB0AIBADFho18CAQCgGwYJKoZIhvcNAQUMMA4E
76+
CLfrI6dr0gUWAgITiDAjBgsqhkiG9w0BCRADCTAUBggqhkiG9w0DBwQIZpECRWtz
77+
u5kEGDCjerXY8odQ7EEEromZJvAurk/j81IrozBSBgkqhkiG9w0BBwEwMwYLKoZI
78+
hvcNAQkQAw8wJDAUBggqhkiG9w0DBwQI0tCBcU09nxEwDAYIKwYBBQUIAQIFAIAQ
79+
OsYGYUFdAH0RNc1p4VbKEAQUM2Xo8PMHBoYdqEcsbTodlCFAZH4=
80+
-----END PKCS7-----}
81+
--assert block? Load-PKIX pkxi
82+
--assert binary? Load-PKIX/binary pkxi
83+
84+
--test-- "Textual Encoding of Cryptographic Message Syntax"
85+
;@@ https://tools.ietf.org/html/rfc7468#section-9
86+
pkxi:
87+
{-----BEGIN CMS-----
88+
MIGDBgsqhkiG9w0BCRABCaB0MHICAQAwDQYLKoZIhvcNAQkQAwgwXgYJKoZIhvcN
89+
AQcBoFEET3icc87PK0nNK9ENqSxItVIoSa0o0S/ISczMs1ZIzkgsKk4tsQ0N1nUM
90+
dvb05OXi5XLPLEtViMwvLVLwSE0sKlFIVHAqSk3MBkkBAJv0Fx0=
91+
-----END CMS-----}
92+
--assert block? Load-PKIX pkxi
93+
--assert binary? Load-PKIX/binary pkxi
94+
95+
--test-- "One Asymmetric Key and the Textual Encoding of PKCS #8 Private Key Info"
96+
;@@ https://tools.ietf.org/html/rfc7468#section-10
97+
pkxi:
98+
{-----BEGIN PRIVATE KEY-----
99+
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgVcB/UNPxalR9zDYAjQIf
100+
jojUDiQuGnSJrFEEzZPT/92hRANCAASc7UJtgnF/abqWM60T3XNJEzBv5ez9TdwK
101+
H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ
102+
-----END PRIVATE KEY-----}
103+
--assert block? Load-PKIX pkxi
104+
--assert binary? Load-PKIX/binary pkxi
105+
106+
107+
--test-- "Textual Encoding of PKCS #8 Encrypted Private Key Info"
108+
;@@ https://tools.ietf.org/html/rfc7468#section-11
109+
pkxi:
110+
{-----BEGIN ENCRYPTED PRIVATE KEY-----
111+
MIHNMEAGCSqGSIb3DQEFDTAzMBsGCSqGSIb3DQEFDDAOBAghhICA6T/51QICCAAw
112+
FAYIKoZIhvcNAwcECBCxDgvI59i9BIGIY3CAqlMNBgaSI5QiiWVNJ3IpfLnEiEsW
113+
Z0JIoHyRmKK/+cr9QPLnzxImm0TR9s4JrG3CilzTWvb0jIvbG3hu0zyFPraoMkap
114+
8eRzWsIvC5SVel+CSjoS2mVS87cyjlD+txrmrXOVYDE+eTgMLbrLmsWh3QkCTRtF
115+
QC7k0NNzUHTV9yGDwfqMbw==
116+
-----END ENCRYPTED PRIVATE KEY-----}
117+
--assert block? Load-PKIX pkxi
118+
--assert binary? Load-PKIX/binary pkxi
119+
120+
121+
--test-- "Textual Encoding of Attribute Certificates"
122+
;@@ https://tools.ietf.org/html/rfc7468#section-12
123+
pkxi:
124+
{-----BEGIN ATTRIBUTE CERTIFICATE-----
125+
MIICKzCCAZQCAQEwgZeggZQwgYmkgYYwgYMxCzAJBgNVBAYTAlVTMREwDwYDVQQI
126+
DAhOZXcgWW9yazEUMBIGA1UEBwwLU3RvbnkgQnJvb2sxDzANBgNVBAoMBkNTRTU5
127+
MjE6MDgGA1UEAwwxU2NvdHQgU3RhbGxlci9lbWFpbEFkZHJlc3M9c3N0YWxsZXJA
128+
aWMuc3VueXNiLmVkdQIGARWrgUUSoIGMMIGJpIGGMIGDMQswCQYDVQQGEwJVUzER
129+
MA8GA1UECAwITmV3IFlvcmsxFDASBgNVBAcMC1N0b255IEJyb29rMQ8wDQYDVQQK
130+
DAZDU0U1OTIxOjA4BgNVBAMMMVNjb3R0IFN0YWxsZXIvZW1haWxBZGRyZXNzPXNz
131+
dGFsbGVyQGljLnN1bnlzYi5lZHUwDQYJKoZIhvcNAQEFBQACBgEVq4FFSjAiGA8z
132+
OTA3MDIwMTA1MDAwMFoYDzM5MTEwMTMxMDUwMDAwWjArMCkGA1UYSDEiMCCGHmh0
133+
dHA6Ly9pZGVyYXNobi5vcmcvaW5kZXguaHRtbDANBgkqhkiG9w0BAQUFAAOBgQAV
134+
M9axFPXXozEFcer06bj9MCBBCQLtAM7ZXcZjcxyva7xCBDmtZXPYUluHf5OcWPJz
135+
5XPus/xS9wBgtlM3fldIKNyNO8RsMp6Ocx+PGlICc7zpZiGmCYLl64lAEGPO/bsw
136+
Smluak1aZIttePeTAHeJJs8izNJ5aR3Wcd3A5gLztQ==
137+
-----END ATTRIBUTE CERTIFICATE-----}
138+
--assert block? Load-PKIX pkxi
139+
--assert binary? Load-PKIX/binary pkxi
140+
141+
142+
;-- SSH public keys (not real PKIX, but can be handled)
143+
;@@ https://tools.ietf.org/html/rfc4716#section-3.6
144+
145+
--test-- "SSH-public-key-1"
146+
pkxi:
147+
{---- BEGIN SSH2 PUBLIC KEY ----
148+
Comment: "1024-bit RSA, converted from OpenSSH by me@example.com"
149+
x-command: /home/me/bin/lock-in-guest.sh
150+
AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
151+
YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
152+
5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
153+
---- END SSH2 PUBLIC KEY ----}
154+
155+
--assert block? Load-PKIX pkxi
156+
--assert binary? Load-PKIX/binary pkxi
157+
158+
--test-- "SSH-public-key-2"
159+
pkxi:
160+
{---- BEGIN SSH2 PUBLIC KEY ----
161+
Comment: This is my public key for use on \
162+
servers which I don't like.
163+
AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
164+
W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
165+
YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
166+
vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
167+
J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
168+
vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
169+
AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
170+
n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
171+
sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
172+
---- END SSH2 PUBLIC KEY ----}
173+
174+
--assert block? Load-PKIX pkxi
175+
--assert binary? Load-PKIX/binary pkxi
176+
177+
--test-- "SSH-public-key-3"
178+
pkxi:
179+
{---- BEGIN SSH2 PUBLIC KEY ----
180+
Comment: DSA Public Key for use with MyIsp
181+
AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
182+
W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
183+
YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
184+
vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
185+
J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
186+
vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
187+
AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
188+
n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
189+
sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
190+
---- END SSH2 PUBLIC KEY ----}
191+
--assert block? Load-PKIX pkxi
192+
--assert binary? Load-PKIX/binary pkxi
193+
194+
195+
===end-group===
196+
197+
~~~end-file~~~

0 commit comments

Comments
 (0)