R Under development (unstable) (2025-08-18 r88641 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## simple test suite - avoid testthat! It has an insane amount of > ## unnecessary dependencies. A test package should have exactly 0 > > assert <- function(msg, what) { + cat(" . ", msg,"\n") + stopifnot(what) + .GlobalEnv$ok <- .GlobalEnv$ok + 1L + } > > xfail <- function(...) suppressWarnings(tryCatch({ ...; FALSE }, error=function(e) TRUE)) > > ## none of these are fatal > info <- function(...) message(" -- ", ...) > err <- function(...) message(" ** ERROR: ", ...) > warn <- function(...) message(" !! ", ...) > > ## all warnings (unless suppressed) are errors > options(warn=2) > > library(PKI) Loading required package: base64enc > > .GlobalEnv$ok <- 0L > > ## Majority of tests are in th3 examples, > ## so we won't repeat those, but some special cases > ## not covered there as well as expected failures > > info("Checking failure paths") -- Checking failure paths > xfail(PKI.load.cert(what="foo", file="bar")) ## set both what and file [1] TRUE > xfail(PKI.load.cert("foo", "DER")) ## binary format with text [1] TRUE > xfail(PKI.load.cert("nothing")) ## invalid content [1] TRUE > xfail(PKI.digest("foo", "bar")) ## invalid hash spec [1] TRUE > xfail(PKI.load.key(what="foo", file="bar")) [1] TRUE > xfail(PKI:::PKI.decode.SSH2(fn.priv.der)) ## try to load invalid content [1] TRUE > > info("Checking key paths via files/connections") -- Checking key paths via files/connections > key <- PKI.genRSAkey(bits = 2048L) > fn.priv.pem <- tempfile() > PKI.save.key(key, target=fn.priv.pem) [1] "-----BEGIN RSA PRIVATE KEY-----" [2] "MIIEogIBAAKCAQEAujwCSex2tGHJ5EkqVXHX7hnfyN931gsh8nnc1y3/a2u6UD4A" [3] "lb87Q/vUUg3KTrIrgvXTzSlJktJWHUwVdB9oddXH33zp0+At/SzKq4RYgOHLfd9l" [4] "Teqktg0nogyU+I70BB2bVWQUPAVqWudrDYe2JWJytgo4Ev6cBsqJOcHCJdHWjAQW" [5] "gjY93havuRBVxGMROGuxhspggbgohsmmrHcptojdhaGMWAPPW1t8qGE/tamxbE6Q" [6] "HB5wN4JZmqVXs2MW/1fkEmO43Tn14UjApRmx/Nm1MZJfKSYQCuhWiXoULvOh/S7l" [7] "UWcimqZgI44d75Y3lxcMKabolYbEvP6kRZ4+XQIDAQABAoIBAAyOUC8wuJ4Xu7de" [8] "8XI6Ty8X4n0WB+vP61WAPtHpIX/aDwEq9PojnvjJ6ToxANNGcuWM8l8yKeoysSif" [9] "gRDHr1DGfYfFUbR9uEwJ8Y4XyanCz2fooFlc+QbnIyVrSL3rUWtXnannqe+UA+Qm" [10] "FxMd87tYhFhenwI01Usl65OPyymmetsH+glBsLKnvaY/2+ZKbSgefD2zGESuBjnz" [11] "IPFCsdSEff9wE9pUtzyX6zMlOUVDn/i0MXeQLTfvGxX36PPuQm4sgYXb92pU+9zP" [12] "l1ki7lR9Wx6139wbJgCtiqUU0wz3SqrrlJ81r/Zx9l0fjI41EBOHz40tfujO2u+T" [13] "epoYDUcCgYEA/EWihwVvZhVFaVE16dawq98mrIKoO5Wh7BAogbKzBc7U8xkC05MF" [14] "wBdREUfUq33PBpOIIWlOQdGq9VZWFGRv25i4PYx3CpJVB6w6tpDiODY8X2CfebjK" [15] "YxMlN1jbS8NdsXybxvkWRiSQc5yw5pbWPn3NpAZN7dW9Ljd1Uo/fu7cCgYEAvPyM" [16] "bk3kP8rguhRzXq5SkbKhjhZV4om/rpL/pd2ZqpH265234Qq3kumXE5FsqO6KFzN/" [17] "L/6Wi50uu30PctO0B4zPAOohGVhXffa+tnYAD0o9S9jUJ+yTwOib2ZlYaMbCt8wk" [18] "BQJYuxTIYnvrOhV6Dd09hlMV/3Qa1Qp7Bu+7PosCgYAb0aYBk7TcIf5chcsXNUiY" [19] "O2xtW58nqvGHMaT14HnjaxKKmDh6klzw+OFEsZIfMylwRTae0JkDoxZiJZoqd4Tq" [20] "R2YRy3qZHNfpl7GFzmZT4o83yVTsvFb9I/BXsSHFsg6T8vTOtUsigwe26BGN7BZG" [21] "H+NcciGH16kb/puediUq8wKBgF4my6egcpg9cJwD2D5RRp2Diu0Iv5zu12oXnfl6" [22] "XzYVJhjYKGWbOz2b1kJPbvzyaiWI6FJ22XWQx1lswqeIROaGBhMEkZzY4C3HIdgx" [23] "DXKQn90LlxaUzD+NIyfTN7JrY1LCByfftWjuv64g4l27mWUS1bX36rurkjqU0Bny" [24] "kSxlAoGAH8QZTIbZSdggIgoJ+Jp4EtNf034LPMTXKOBkQmVzc9o/rPOYpbCe79KC" [25] "OFhgF2zjGNcfDhOnRyb3Pr4EaCqt5PQOHQRfRo74YTWUO005DMPwzm2Yma+zTXwV" [26] "e9bam+HwNyu3cq2bE9vIm6Z+XMvJk0T6M9CAnqAYNj6ngdQKud0=" [27] "-----END RSA PRIVATE KEY-----" > fn.priv.der <- tempfile() > PKI.save.key(key, "DER", target=fn.priv.der) [1] 30 82 04 a2 02 01 00 02 82 01 01 00 ba 3c 02 49 ec 76 b4 61 c9 e4 49 2a [25] 55 71 d7 ee 19 df c8 df 77 d6 0b 21 f2 79 dc d7 2d ff 6b 6b ba 50 3e 00 [49] 95 bf 3b 43 fb d4 52 0d ca 4e b2 2b 82 f5 d3 cd 29 49 92 d2 56 1d 4c 15 [73] 74 1f 68 75 d5 c7 df 7c e9 d3 e0 2d fd 2c ca ab 84 58 80 e1 cb 7d df 65 [97] 4d ea a4 b6 0d 27 a2 0c 94 f8 8e f4 04 1d 9b 55 64 14 3c 05 6a 5a e7 6b [121] 0d 87 b6 25 62 72 b6 0a 38 12 fe 9c 06 ca 89 39 c1 c2 25 d1 d6 8c 04 16 [145] 82 36 3d de 16 af b9 10 55 c4 63 11 38 6b b1 86 ca 60 81 b8 28 86 c9 a6 [169] ac 77 29 b6 88 dd 85 a1 8c 58 03 cf 5b 5b 7c a8 61 3f b5 a9 b1 6c 4e 90 [193] 1c 1e 70 37 82 59 9a a5 57 b3 63 16 ff 57 e4 12 63 b8 dd 39 f5 e1 48 c0 [217] a5 19 b1 fc d9 b5 31 92 5f 29 26 10 0a e8 56 89 7a 14 2e f3 a1 fd 2e e5 [241] 51 67 22 9a a6 60 23 8e 1d ef 96 37 97 17 0c 29 a6 e8 95 86 c4 bc fe a4 [265] 45 9e 3e 5d 02 03 01 00 01 02 82 01 00 0c 8e 50 2f 30 b8 9e 17 bb b7 5e [289] f1 72 3a 4f 2f 17 e2 7d 16 07 eb cf eb 55 80 3e d1 e9 21 7f da 0f 01 2a [313] f4 fa 23 9e f8 c9 e9 3a 31 00 d3 46 72 e5 8c f2 5f 32 29 ea 32 b1 28 9f [337] 81 10 c7 af 50 c6 7d 87 c5 51 b4 7d b8 4c 09 f1 8e 17 c9 a9 c2 cf 67 e8 [361] a0 59 5c f9 06 e7 23 25 6b 48 bd eb 51 6b 57 9d a9 e7 a9 ef 94 03 e4 26 [385] 17 13 1d f3 bb 58 84 58 5e 9f 02 34 d5 4b 25 eb 93 8f cb 29 a6 7a db 07 [409] fa 09 41 b0 b2 a7 bd a6 3f db e6 4a 6d 28 1e 7c 3d b3 18 44 ae 06 39 f3 [433] 20 f1 42 b1 d4 84 7d ff 70 13 da 54 b7 3c 97 eb 33 25 39 45 43 9f f8 b4 [457] 31 77 90 2d 37 ef 1b 15 f7 e8 f3 ee 42 6e 2c 81 85 db f7 6a 54 fb dc cf [481] 97 59 22 ee 54 7d 5b 1e b5 df dc 1b 26 00 ad 8a a5 14 d3 0c f7 4a aa eb [505] 94 9f 35 af f6 71 f6 5d 1f 8c 8e 35 10 13 87 cf 8d 2d 7e e8 ce da ef 93 [529] 7a 9a 18 0d 47 02 81 81 00 fc 45 a2 87 05 6f 66 15 45 69 51 35 e9 d6 b0 [553] ab df 26 ac 82 a8 3b 95 a1 ec 10 28 81 b2 b3 05 ce d4 f3 19 02 d3 93 05 [577] c0 17 51 11 47 d4 ab 7d cf 06 93 88 21 69 4e 41 d1 aa f5 56 56 14 64 6f [601] db 98 b8 3d 8c 77 0a 92 55 07 ac 3a b6 90 e2 38 36 3c 5f 60 9f 79 b8 ca [625] 63 13 25 37 58 db 4b c3 5d b1 7c 9b c6 f9 16 46 24 90 73 9c b0 e6 96 d6 [649] 3e 7d cd a4 06 4d ed d5 bd 2e 37 75 52 8f df bb b7 02 81 81 00 bc fc 8c [673] 6e 4d e4 3f ca e0 ba 14 73 5e ae 52 91 b2 a1 8e 16 55 e2 89 bf ae 92 ff [697] a5 dd 99 aa 91 f6 eb 9d b7 e1 0a b7 92 e9 97 13 91 6c a8 ee 8a 17 33 7f [721] 2f fe 96 8b 9d 2e bb 7d 0f 72 d3 b4 07 8c cf 00 ea 21 19 58 57 7d f6 be [745] b6 76 00 0f 4a 3d 4b d8 d4 27 ec 93 c0 e8 9b d9 99 58 68 c6 c2 b7 cc 24 [769] 05 02 58 bb 14 c8 62 7b eb 3a 15 7a 0d dd 3d 86 53 15 ff 74 1a d5 0a 7b [793] 06 ef bb 3e 8b 02 81 80 1b d1 a6 01 93 b4 dc 21 fe 5c 85 cb 17 35 48 98 [817] 3b 6c 6d 5b 9f 27 aa f1 87 31 a4 f5 e0 79 e3 6b 12 8a 98 38 7a 92 5c f0 [841] f8 e1 44 b1 92 1f 33 29 70 45 36 9e d0 99 03 a3 16 62 25 9a 2a 77 84 ea [865] 47 66 11 cb 7a 99 1c d7 e9 97 b1 85 ce 66 53 e2 8f 37 c9 54 ec bc 56 fd [889] 23 f0 57 b1 21 c5 b2 0e 93 f2 f4 ce b5 4b 22 83 07 b6 e8 11 8d ec 16 46 [913] 1f e3 5c 72 21 87 d7 a9 1b fe 9b 9e 76 25 2a f3 02 81 80 5e 26 cb a7 a0 [937] 72 98 3d 70 9c 03 d8 3e 51 46 9d 83 8a ed 08 bf 9c ee d7 6a 17 9d f9 7a [961] 5f 36 15 26 18 d8 28 65 9b 3b 3d 9b d6 42 4f 6e fc f2 6a 25 88 e8 52 76 [985] d9 75 90 c7 59 6c c2 a7 88 44 e6 86 06 13 04 91 9c d8 e0 2d c7 21 d8 31 [1009] 0d 72 90 9f dd 0b 97 16 94 cc 3f 8d 23 27 d3 37 b2 6b 63 52 c2 07 27 df [1033] b5 68 ee bf ae 20 e2 5d bb 99 65 12 d5 b5 f7 ea bb ab 92 3a 94 d0 19 f2 [1057] 91 2c 65 02 81 80 1f c4 19 4c 86 d9 49 d8 20 22 0a 09 f8 9a 78 12 d3 5f [1081] d3 7e 0b 3c c4 d7 28 e0 64 42 65 73 73 da 3f ac f3 98 a5 b0 9e ef d2 82 [1105] 38 58 60 17 6c e3 18 d7 1f 0e 13 a7 47 26 f7 3e be 04 68 2a ad e4 f4 0e [1129] 1d 04 5f 46 8e f8 61 35 94 3b 4d 39 0c c3 f0 ce 6d 98 99 af b3 4d 7c 15 [1153] 7b d6 da 9b e1 f0 37 2b b7 72 ad 9b 13 db c8 9b a6 7e 5c cb c9 93 44 fa [1177] 33 d0 80 9e a0 18 36 3e a7 81 d4 0a b9 dd attr(,"class") [1] "private.key.DER" > PKI.load.key(file=fn.priv.pem) attr(,"class") [1] "private.key" > PKI.load.key(file=fn.priv.der, format="DER", private=TRUE) attr(,"class") [1] "private.key" > fn.pub.pem <- tempfile() > PKI.save.key(key, target=fn.pub.pem, private=FALSE) [1] "-----BEGIN PUBLIC KEY-----" [2] "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAujwCSex2tGHJ5EkqVXHX" [3] "7hnfyN931gsh8nnc1y3/a2u6UD4Alb87Q/vUUg3KTrIrgvXTzSlJktJWHUwVdB9o" [4] "ddXH33zp0+At/SzKq4RYgOHLfd9lTeqktg0nogyU+I70BB2bVWQUPAVqWudrDYe2" [5] "JWJytgo4Ev6cBsqJOcHCJdHWjAQWgjY93havuRBVxGMROGuxhspggbgohsmmrHcp" [6] "tojdhaGMWAPPW1t8qGE/tamxbE6QHB5wN4JZmqVXs2MW/1fkEmO43Tn14UjApRmx" [7] "/Nm1MZJfKSYQCuhWiXoULvOh/S7lUWcimqZgI44d75Y3lxcMKabolYbEvP6kRZ4+" [8] "XQIDAQAB" [9] "-----END PUBLIC KEY-----" > fn.pub.der <- tempfile() > PKI.save.key(key, "DER", target=fn.pub.der, private=FALSE) [1] 30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 82 01 0f 00 30 [26] 82 01 0a 02 82 01 01 00 ba 3c 02 49 ec 76 b4 61 c9 e4 49 2a 55 71 d7 ee 19 [51] df c8 df 77 d6 0b 21 f2 79 dc d7 2d ff 6b 6b ba 50 3e 00 95 bf 3b 43 fb d4 [76] 52 0d ca 4e b2 2b 82 f5 d3 cd 29 49 92 d2 56 1d 4c 15 74 1f 68 75 d5 c7 df [101] 7c e9 d3 e0 2d fd 2c ca ab 84 58 80 e1 cb 7d df 65 4d ea a4 b6 0d 27 a2 0c [126] 94 f8 8e f4 04 1d 9b 55 64 14 3c 05 6a 5a e7 6b 0d 87 b6 25 62 72 b6 0a 38 [151] 12 fe 9c 06 ca 89 39 c1 c2 25 d1 d6 8c 04 16 82 36 3d de 16 af b9 10 55 c4 [176] 63 11 38 6b b1 86 ca 60 81 b8 28 86 c9 a6 ac 77 29 b6 88 dd 85 a1 8c 58 03 [201] cf 5b 5b 7c a8 61 3f b5 a9 b1 6c 4e 90 1c 1e 70 37 82 59 9a a5 57 b3 63 16 [226] ff 57 e4 12 63 b8 dd 39 f5 e1 48 c0 a5 19 b1 fc d9 b5 31 92 5f 29 26 10 0a [251] e8 56 89 7a 14 2e f3 a1 fd 2e e5 51 67 22 9a a6 60 23 8e 1d ef 96 37 97 17 [276] 0c 29 a6 e8 95 86 c4 bc fe a4 45 9e 3e 5d 02 03 01 00 01 attr(,"class") [1] "public.key.DER" > PKI.load.key(file=fn.pub.pem) attr(,"class") [1] "public.key" > PKI.load.key(file=fn.pub.der, format="DER", private=FALSE) attr(,"class") [1] "public.key" > > info("gmp") -- gmp > if (requireNamespace("gmp", quietly=TRUE)) { + PKI.mkRSApubkey(gmp::as.bigz("119445732379544598056145200053932732877863846799652384989588303737527328743970559883211146487286317168142202446955508902936035124709397221178664495721428029984726868375359168203283442617134197706515425366188396513684446494070223079865755643116690165578452542158755074958452695530623055205290232290667934914919")) + } else { + warn("gmp not found, skipping bignum tests") + } !! gmp not found, skipping bignum tests > > info("Ciphers") -- Ciphers > skey <- PKI.random(256) > for (cipher in c("aes256ecb", "aes256ofb", "bfcbc", "bfecb", "bfofb", "bfcfb")) + assert(cipher, all(PKI.decrypt(PKI.encrypt(charToRaw("foo!"), skey, cipher), skey, cipher)[1:4] == charToRaw("foo!"))) . aes256ecb . aes256ofb . bfcbc . bfecb . bfofb . bfcfb > iv <- PKI.random(256) > for (cipher in c("bfcbc", "bfecb", "bfofb", "bfcfb")) + assert(paste0(cipher, " (with IV)"), + all(PKI.decrypt(PKI.encrypt(charToRaw("foo!"), skey, cipher, iv=iv), skey, cipher, iv=iv)[1:4] == charToRaw("foo!"))) . bfcbc (with IV) . bfecb (with IV) . bfofb (with IV) . bfcfb (with IV) > > info("ASN.1") -- ASN.1 > > assert("ASN.1 encode/decode", + { d <- ASN1.decode(ASN1.encode(ASN1.item(0:255, 3L))) + ASN1.type(d) == 3L && all(d == as.raw(0:255)) }) . ASN.1 encode/decode > > info("Tar ball signing") -- Tar ball signing > tmpfn <- c(fn.pub.der, fn.pub.pem, fn.priv.der, fn.priv.pem) > fn <- tempfile() > ## on some systems using abs paths can break 100 byte limit > ## so we must do this in the tempdir > wd <- getwd() > td <- tempdir() > setwd(td) > tar(fn, basename(tmpfn), "none") > PKI.sign.tar(fn, key) > PKI.verify.tar(fn, key) [1] TRUE > setwd(wd) > > unlink(c(fn, tmpfn)) > > proc.time() user system elapsed 0.23 0.15 0.43