From c0539dccf5f0976d85c4386b26cbbdd3b3908290 Mon Sep 17 00:00:00 2001 From: jjg-123 Date: Sun, 22 Dec 2024 08:36:27 -0600 Subject: [PATCH] Fixes for https://github.com/ncsa/qdl/issues/87 https://github.com/ncsa/qdl/issues/88 https://github.com/ncsa/qdl/issues/89 --- language/buildNumber.properties | 4 +- language/pom.xml | 14 +- language/src/main/docs/crypto.odt | Bin 18148 -> 46145 bytes language/src/main/docs/qdldb-extension.odt | Bin 43556 -> 47279 bytes .../qdl_lang/expressions/ExpressionImpl.java | 17 +- .../expressions/ModuleExpression.java | 6 +- .../qdl_lang/extensions/crypto/Crypto.java | 1163 ++++++++++++++--- .../extensions/crypto/CryptoModule.java | 17 +- .../qdl_lang/extensions/http/HTTPClient.java | 14 +- tests/pom.xml | 7 +- .../test/java/org/qdl_lang/ModuleTests.java | 2 +- 11 files changed, 1033 insertions(+), 211 deletions(-) diff --git a/language/buildNumber.properties b/language/buildNumber.properties index 6e341a510..583670696 100644 --- a/language/buildNumber.properties +++ b/language/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sun Dec 01 07:47:11 CST 2024 -buildNumber\\d*=13741 +#Thu Dec 19 11:09:25 CST 2024 +buildNumber\\d*=13747 diff --git a/language/pom.xml b/language/pom.xml index 4c3d8ec58..d8a74994e 100644 --- a/language/pom.xml +++ b/language/pom.xml @@ -201,22 +201,22 @@ 6.x-SNAPSHOT compile - + edu.uiuc.ncsa.security util 6.x-SNAPSHOT compile - + + --> + + com.mysql + mysql-connector-j + 9.1.0 org.apache.derby diff --git a/language/src/main/docs/crypto.odt b/language/src/main/docs/crypto.odt index aa39ec37b1fb97c2e8afe92866b1c5d78b2863b3..72ff9053decd85530b404cc70e4e4aa514540ca4 100644 GIT binary patch literal 46145 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%0DO@{$1;@k&OSEUn1zg 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 GeEUDF{=S$1 literal 43556 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 H-?je(Z$?uo diff --git a/language/src/main/java/org/qdl_lang/expressions/ExpressionImpl.java b/language/src/main/java/org/qdl_lang/expressions/ExpressionImpl.java index e6db8952d..4c43fb73f 100644 --- a/language/src/main/java/org/qdl_lang/expressions/ExpressionImpl.java +++ b/language/src/main/java/org/qdl_lang/expressions/ExpressionImpl.java @@ -245,7 +245,22 @@ public List getEvaluatedArgs() { public List evaluatedArgs(State state) { evaluatedArgs = new ArrayList<>(getArgCount()); for (int i = 0; i < getArgCount(); i++) { - evaluatedArgs.add(evalArg(i, state)); + // Fix https://github.com/ncsa/qdl/issues/87 + Object eval = evalArg(i, state); + if(eval == null) { + Object x = getArgAt(i); + String message; + if(x instanceof VariableNode){ + message = ((VariableNode)x).getVariableReference() + " at argument " + i + " not found"; + }else{ + message = "argument " + i + " not found"; + } + // Found when a person assigned an empty set {} for an empty stem [] which was + // therefore not a variable. It should have failed here rather than sending a null to + // cause an NPE later. + throw new QDLExceptionWithTrace( message, getArguments().get(i)); + } + evaluatedArgs.add(eval); } return evaluatedArgs; } diff --git a/language/src/main/java/org/qdl_lang/expressions/ModuleExpression.java b/language/src/main/java/org/qdl_lang/expressions/ModuleExpression.java index 8bcf0fba3..82e47d281 100644 --- a/language/src/main/java/org/qdl_lang/expressions/ModuleExpression.java +++ b/language/src/main/java/org/qdl_lang/expressions/ModuleExpression.java @@ -213,10 +213,11 @@ ambient state so that, eventually, f(s) can be evaluated (s is in the ambient s // g(x)->f(x)-x; // fails unless f is included in its state. //newState.getVStack().append(ambientState.getVStack().getLocal()); // add in any passed in state (e.g. function arguments to module functions) - + // Fix for https://github.com/ncsa/qdl/issues/89 -- be attentive to the fact that these are + // put into the state in reverse order! + newState.getVStack().appendTables(ambientState.getVStack()); // add in any passed in state for variables newState.getVStack().appendTables(getAmbientState().getVStack()); // add in the state of the module newState.getFTStack().appendTables(ambientState.getFTStack()); // add in any passed in state for functions - newState.getVStack().appendTables(ambientState.getVStack()); // add in any passed in state for variables newState.setModuleState(true); // Next line is for https://github.com/ncsa/qdl/issues/84 newState.setScriptArgs(ambientState.getScriptArgs()); @@ -239,6 +240,7 @@ ambient state so that, eventually, f(s) can be evaluated (s is in the ambient s // send along evaluated args with ambient state, but do not allow // ambient state to override internal module state for functions, loaded modules etc. r = getExpression().evaluate(getModuleState()); + //r = getExpression().evaluate(newState); } else { r = getExpression().evaluate(newState); // gets local overrides from ambient state if (getExpression() instanceof DyadicFunctionReferenceNode) { diff --git a/language/src/main/java/org/qdl_lang/extensions/crypto/Crypto.java b/language/src/main/java/org/qdl_lang/extensions/crypto/Crypto.java index b4bcf6afc..da0ebdff8 100644 --- a/language/src/main/java/org/qdl_lang/extensions/crypto/Crypto.java +++ b/language/src/main/java/org/qdl_lang/extensions/crypto/Crypto.java @@ -1,10 +1,18 @@ package org.qdl_lang.extensions.crypto; -import org.qdl_lang.evaluate.MathEvaluator; +import com.nimbusds.jose.EncryptionMethod; +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.jwk.*; +import com.nimbusds.jose.jwk.RSAKey; +import com.nimbusds.jose.jwk.gen.OctetSequenceKeyGenerator; +import edu.uiuc.ncsa.security.util.crypto.CertUtil; +import edu.uiuc.ncsa.security.util.crypto.KeyUtil; import org.qdl_lang.extensions.QDLFunction; import org.qdl_lang.extensions.QDLMetaModule; import org.qdl_lang.state.State; import org.qdl_lang.util.QDLFileUtil; +import org.qdl_lang.variables.QDLNull; +import org.qdl_lang.variables.QDLSet; import org.qdl_lang.variables.QDLStem; import edu.uiuc.ncsa.security.util.crypto.DecryptUtils; import edu.uiuc.ncsa.security.util.jwk.JSONWebKey; @@ -16,10 +24,15 @@ import org.apache.commons.codec.binary.Base64; import java.io.UnsupportedEncodingException; +import java.math.BigInteger; import java.security.*; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateParsingException; +import java.security.cert.X509Certificate; +import java.security.interfaces.*; import java.security.spec.InvalidKeySpecException; -import java.util.ArrayList; -import java.util.List; +import java.security.spec.RSAPublicKeySpec; +import java.util.*; /** *

Created by Jeff Gaynor
@@ -41,6 +54,12 @@ public void setJwkUtil(JWKUtil2 jwkUtil) { public static final String CREATE_KEY_NAME = "create_key"; + /* + crypto := j_load('crypto'); + crypto#create_key({'type':'EC','alg':'ES256','curve':'P-256'}) +crypto#create_key({'type':'AES','alg':'A256GCM','length':512}) + + */ public class CreateKey implements QDLFunction { @Override public String getName() { @@ -49,65 +68,110 @@ public String getName() { @Override public int[] getArgCount() { - return new int[]{0, 1, 2}; + return new int[]{0, 1}; } @Override public Object evaluate(Object[] objects, State state) throws Throwable { // default is RSA key. 1024 bits, RS256 alg. String type = "RSA"; - int keyLength= 1024; + int keyLength = 1024; String alg = "RS256"; String curve = "P-256"; JSONWebKey webKey = null; - if(objects.length == 0){ - webKey = getJwkUtil().createRSAKey(keyLength,alg); + + if (objects.length == 0) { + webKey = getJwkUtil().createRSAKey(keyLength, alg); } - if(objects.length == 1){ - if(objects[0] instanceof QDLStem){ + if (objects.length == 1) { + if (objects[0] instanceof QDLStem) { boolean unknownType = true; QDLStem stem = (QDLStem) objects[0]; - if(stem.containsKey("type")){ + if (stem.containsKey("type")) { type = stem.getString("type"); - } else{ + } else { throw new IllegalArgumentException(getName() + " is missing the type of the key. Must be RSA or EC"); } - if(type.equals("RSA")){ - unknownType = false; - if(stem.containsKey("length")){ + if (type.equals("RSA")) { + unknownType = false; + if (stem.containsKey("length")) { keyLength = stem.getLong("length").intValue(); } if (keyLength % 256 != 0) { throw new IllegalArgumentException("the key size of " + keyLength + " must be a multiple of 256"); } - if(stem.containsKey("alg")){ + if (stem.containsKey("alg")) { alg = stem.getString("alg"); } webKey = getJwkUtil().createRSAKey(keyLength, alg); } - if(type.equals("EC")){ + if (type.equals("EC")) { unknownType = false; - if(stem.containsKey("curve")){ + if (stem.containsKey("curve")) { curve = stem.getString("curve"); } - if(stem.containsKey("alg")){ + if (stem.containsKey("alg")) { alg = stem.getString("alg"); - }else{ + } else { alg = "ES256"; // default for elliptic curves. } webKey = getJwkUtil().createECKey(curve, alg); } - - if(unknownType){ + if (type.equals("AES")) { + // See https://www.rfc-editor.org/rfc/rfc7518.html#section-6.4 + unknownType = false; + EncryptionMethod encryptionMethod = null; + if (stem.containsKey("alg")) { + alg = stem.getString("alg"); + switch (alg) { + case "A128GCM": + encryptionMethod = EncryptionMethod.A128GCM; + break; + case "A192GCM": + encryptionMethod = EncryptionMethod.A192GCM; + break; + case "A256GCM": + encryptionMethod = EncryptionMethod.A256GCM; + break; + default: + encryptionMethod = null; + break; + } + } + int length = 256; + if (stem.containsKey("length")) { + length = Math.toIntExact(stem.getLong("length")); + } + OctetSequenceKey jwk; + if (encryptionMethod == null) { + jwk = new OctetSequenceKeyGenerator(length) + .issueTime(new Date()) // issued-at timestamp (optional) + .keyID(getRandomID())// give the key some ID (optional) + .generate(); + + } else { + jwk = new OctetSequenceKeyGenerator(length) + .issueTime(new Date()) // issued-at timestamp (optional) + .keyID(getRandomID()) // give the key some ID (optional) + .algorithm(encryptionMethod) // indicate the intended key alg (optional) + .generate(); + } + QDLStem out = new QDLStem(); + JSONObject jsonObject = new JSONObject(); + jsonObject.putAll(jwk.toJSONObject()); + out.fromJSON(jsonObject); + return out; + } + if (unknownType) { throw new IllegalArgumentException("unknown key type '" + stem.get("type") + "'"); } - }else{ - if(!(objects[0] instanceof Long)){ + } else { + if (!(objects[0] instanceof Long)) { throw new IllegalArgumentException("single argument must be the length of the RSA key"); } - keyLength = ((Long)objects[0]).intValue(); + keyLength = ((Long) objects[0]).intValue(); if (keyLength % 256 != 0) { throw new IllegalArgumentException("the key size of " + keyLength + " must be a multiple of 256"); } @@ -137,13 +201,26 @@ public List getDocumentation(int argCount) { dd.add(getName() + "() create an RSA key with the default key size of 1024"); break; case 1: - dd.add(getName() + "(key_size | params.) create an RSA key with the given key_size > 1024."); + dd.add(getName() + "(key_size | params.) either an RSA or elliptic curve key."); + dd.add("key_size = bit count for an RSA RS256 key. "); dd.add("Note that the key_size must be a multiple of 256."); dd.add("If a stem of parameters is passed, it is of the form"); - dd.add(" {'type' :'RSA'|'EC, 'alg':algorithm, 'length':rsa key length, 'curve' : elliptic curve.}"); + dd.add(" {'type' :'RSA'|'EC' | 'AES', 'alg':algorithm, 'length':rsa or aes key length, 'curve' : elliptic curve.}"); dd.add("E.g."); dd.add(" " + getName() + "({'type':'EC':'curve':'P-256', 'alg':'ES256'})"); - dd.add("would use the curve P-256 with the ES256 algorithm to create an ellitpci curve key."); + dd.add("would use the curve P-256 with the ES256 algorithm to create an elliptic curve key."); + dd.add("EC curves:P-256, P-256K, P-384, P-521, secp256k1"); + dd.add("EC algortihms:ES256, ES256k, ES384, ES512"); + dd.add("RSA algortihms: RS256, RS385, RS512"); + dd.add("RSA key length is a multiple of 256."); + dd.add("AES algorithms: A128GCM, A192GCM, A256GCM"); + dd.add("AES key length is creater then 112 and must be a multiple of 8."); + dd.add("\nE.g. to make an RSA key"); + dd.add(" " + getName() + "({'length':4096, 'alg':'RS512', 'type':'RSA'})"); + dd.add("{alg:RS512,..."); + dd.add("\nE.g. An AES key"); + dd.add(" crypto#create_key({'type':'AES','alg':'A256GCM','length':512})\n" + + "{alg:A256GCM, k:H4t50v...."); break; } dd.add("One hears of 'key pairs', though in point of fact, the public bits of a key"); @@ -245,14 +322,6 @@ public Object evaluate(Object[] objects, State state) throws Throwable { QDLFileUtil.writeTextFile(state, filePath, jsonObject.toString(2)); return Boolean.TRUE; } - /* - module_import(module_load(info().lib.tools.crypto, 'java')); - keys. := create_rsa_key(2048, 3) - export_jwks(keys., '/tmp/keys.jwks') - q. := import_jwks('/tmp/keys.jwks') - - */ - List dd = new ArrayList<>(); @Override @@ -265,6 +334,203 @@ public List getDocumentation(int argCount) { } } + public static final String IMPORT_PKCS_NAME = "import_pkcs"; + public static final String PKCS_1_TYPE = "pkcs_1"; + public static final String PKCS_8_TYPE = "pkcs_8"; + public static final String X509_TYPE = "x509"; + + public class ImportPKCS implements QDLFunction { + @Override + public String getName() { + return IMPORT_PKCS_NAME; + } + + @Override + public int[] getArgCount() { + return new int[]{1, 2}; + } + + @Override + public Object evaluate(Object[] objects, State state) throws Throwable { + if (!(objects[0] instanceof String)) { + throw new IllegalArgumentException("The first argument of " + getName() + " must be a string that is the path to the file"); + } + String filePath = (String) objects[0]; + String type = PKCS_8_TYPE; //default + String rawFile = QDLFileUtil.readTextFile(state, filePath); + PrivateKey privateKey = null; + PublicKey publicKey = null; + if (objects.length != 1) { + type = (String) objects[1]; + switch (type) { + case PKCS_1_TYPE: + privateKey = KeyUtil.fromPKCS1PEM(rawFile); + break; + case PKCS_8_TYPE: + privateKey = KeyUtil.fromPKCS8PEM(rawFile); + break; + case X509_TYPE: + publicKey = KeyUtil.fromX509PEM(rawFile); + break; + default: + throw new IllegalArgumentException("Unknown key type: " + type); + } + } + + JWK jwk = null; + if (privateKey == null) { + jwk = getJwk(publicKey); + } else { + RSAPrivateCrtKey privk = (RSAPrivateCrtKey) privateKey; + RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(privk.getModulus(), privk.getPublicExponent()); + System.out.println(getClass().getSimpleName() + ": priv key alg=" + privk.getAlgorithm()); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + publicKey = keyFactory.generatePublic(publicKeySpec); + + jwk = new RSAKey.Builder((RSAPublicKey) publicKey) + .privateKey((RSAPrivateKey) privateKey) + .keyID(getRandomID()) + .issueTime(new Date()) + .algorithm(JWSAlgorithm.RS256) // for use in signing, not from the key + .keyUse(new KeyUse("sig")) + .build(); + } + JSONWebKey jsonWebKey = new JSONWebKey(jwk); + QDLStem outStem = webKeyToStem(jsonWebKey); + return outStem; + } + + @Override + public List getDocumentation(int argCount) { + List dd = new ArrayList<>(); + switch (argCount) { + case 1: + dd.add(getName() + "(file_path) - read a PKCS 1 (RSA private key) in PEM format and return as a stem"); + dd.add("file_path - path to the PEM encoded file"); + break; + case 2: + dd.add(getName() + "(file_path, type) - read a PEM format key, retuning a stem."); + dd.add("file_path - path to the PEM encoded file"); + dd.add("type - supported types are "); + dd.add(" " + PKCS_1_TYPE + " - PKCS 1, PEM encoded RSA private key"); + dd.add(" " + PKCS_8_TYPE + " - PKCS 8, PEM encoded unencrypted private key"); + dd.add(" " + X509_TYPE + " - X509, PEM encoded public key"); + break; + } + return dd; + } + } + + private JWK getJwk(PublicKey publicKey) { + JWK jwk = null; + if (publicKey instanceof RSAPublicKey) { + jwk = new RSAKey.Builder((RSAPublicKey) publicKey) + .keyID(getRandomID()) + .issueTime(new Date()) + .algorithm(JWSAlgorithm.RS256) // for use in signing, not from the key + .keyUse(new KeyUse("sig")) + .build(); + } +/* if(publicKey instanceof ECPublicKey){ + ECPublicKey ecPublicKey = (ECPublicKey)publicKey; + EllipticCurve curve = ecPublicKey.getParams().getCurve(); + + jwk = new ECKey.Builder(Curve.SECP256K1, + ecPublicKey) + .keyID(getRandomID()) + .issueTime(new Date()) + .algorithm(JWSAlgorithm.ES256) + .keyUse(new KeyUse("sig")) + .build(); + System.out.println(publicKey); + }*/ + + return jwk; + } + + public static final String EXPORT_PKCS_NAME = "export_pkcs"; + + public class ExportPKCS implements QDLFunction { + @Override + public String getName() { + return EXPORT_PKCS_NAME; + } + + @Override + public int[] getArgCount() { + return new int[]{2, 3}; + } + + @Override + public Object evaluate(Object[] objects, State state) throws Throwable { + if (!(objects[0] instanceof QDLStem)) { + throw new IllegalArgumentException(getName() + " first argument must be a QDL stem that is they key"); + } + QDLStem key = (QDLStem) objects[0]; + if (!(objects[1] instanceof String)) { + throw new IllegalArgumentException(getName() + " - second argument must be a string that is the path to the file"); + } + String path = (String) objects[1]; + String type = PKCS_8_TYPE; + if (objects.length == 3) { + if (!(objects[2] instanceof String)) { + throw new IllegalArgumentException(getName() + " third argument must be a string that is the path to the file"); + } + type = (String) objects[2]; + } + JSONWebKey jwk = JSONWebKeyUtil.getJsonWebKey(key.toJSON().toString()); + String content; + switch (type) { + case PKCS_1_TYPE: + content = KeyUtil.toPKCS1PEM(jwk.privateKey); + break; + case PKCS_8_TYPE: + content = KeyUtil.toPKCS8PEM(jwk.privateKey); + break; + case X509_TYPE: + content = KeyUtil.toX509PEM(jwk.publicKey); + break; + default: + throw new IllegalArgumentException("Unknown key type: " + type); + } + QDLFileUtil.writeTextFile(state, path, content); + return Boolean.TRUE; + } + + /* + crypto := j_load('crypto'); + a. := crypto#import_pkcs('/home/ncsa/temp/public_key.pem', 'x509'); + b. := crypto#import_pkcs('/home/ncsa/temp/key.pem','pkcs_8'); + crypto#export_pkcs( b., '/tmp/pkcs8.pem', 'pkcs_8') + crypto#export_pkcs( b., '/tmp/pkcs1.pem', 'pkcs_1') + + + */ + @Override + public List getDocumentation(int argCount) { + List dd = new ArrayList<>(); + switch (argCount) { + case 2: + dd.add(getName() + ("(key.,file_path) - write a single private key to a file in PKCS 8 format.")); + dd.add("key. - the JWK representation of a single private key (all that PKCS supports)"); + dd.add("file_path - path to the resulting PEM encoded file"); + dd.add("This function returns true if the operation worked, otherwise it throws an exception."); + break; + case 3: + dd.add(getName() + ("(key., file_path, type) - write a single key to a file in PEM format.")); + dd.add("key. - the JWK representation of a single key (all that PKCS supports)"); + dd.add("file_path - path to the resulting PEM encoded file"); + dd.add("type - one of the following"); + dd.add(PKCS_1_TYPE + " - PKCS 1, for a single private key"); + dd.add(PKCS_8_TYPE + " - PKCS 8, for a single private key"); + dd.add(X509_TYPE + " - X 509 format for a single public key"); + dd.add("This function returns true if the operation worked, otherwise it throws an exception."); + break; + } + return dd; + } + } + public static final String GET_PUBLIC_KEY_NAME = "rsa_public_key"; /** @@ -336,107 +602,261 @@ public String getName() { @Override public int[] getArgCount() { - return new int[]{2, 3}; + return new int[]{0, 2}; } @Override public Object evaluate(Object[] objects, State state) throws Throwable { + if (objects.length == 0) { + // Query for supported ciphers + QDLStem outStem = new QDLStem(); + ArrayList ciphers = new ArrayList<>(); + ciphers.addAll(DecryptUtils.listCiphers()); + outStem.getQDLList().setArrayList(ciphers); + return outStem; + } + if (!(objects[0] instanceof QDLStem)) { throw new IllegalArgumentException("The first argument of " + getName() + " must be a stem"); } - JSONWebKey jsonWebKey = getKeys((QDLStem) objects[0]); - QDLStem arg = null; + // arg 0 is either stem of the key or a cfg stem (which includes the key as 'key' entry) + // arg 1 is either string or stem of strings to encrypt. + QDLStem leftStem = (QDLStem) objects[0]; + if (leftStem.containsKey("kty") && leftStem.getString("kty").equals("oct")) { + return sDeOrEnCrypt(objects, state, true, getName()); + } + JSONWebKey jsonWebKey; + String cipher = "RSA"; // There are several available. boolean usePrivateKey = true; + if (leftStem.containsKey("key")) { + jsonWebKey = getKeys(leftStem.getStem("key")); + if (leftStem.containsKey("cipher")) { + cipher = leftStem.getString("cipher"); + } + if (leftStem.containsKey("use_private")) { + leftStem.getBoolean("use_private"); + } + } else { + jsonWebKey = getKeys(leftStem); + // just use defaults + } + if (usePrivateKey) { + if (jsonWebKey.privateKey == null) { + throw new IllegalArgumentException("Missing private key"); + } + } else { + if (jsonWebKey.publicKey == null) { + throw new IllegalArgumentException("Missing public key"); + } + } + QDLStem rightArg = null; boolean stringArg = false; boolean gotOne = false; if (objects[1] instanceof QDLStem) { gotOne = true; - arg = (QDLStem) objects[1]; + rightArg = (QDLStem) objects[1]; } if (objects[1] instanceof String) { gotOne = true; stringArg = true; - arg = new QDLStem(); - arg.put(0L, objects[1]); + rightArg = new QDLStem(); + rightArg.put(0L, objects[1]); + } + if (objects[1] instanceof QDLSet) { + return encryptOrDecryptSet((QDLSet) objects[1], cipher, jsonWebKey, usePrivateKey, false); } if (!gotOne) { return objects[1]; // nix to do } - if (objects.length == 3) { - if (!(objects[2] instanceof Boolean)) { - throw new IllegalArgumentException("the last argument of " + getName() + " must be a boolean. Default is true"); - } - usePrivateKey = (Boolean) objects[2]; - } - QDLStem out = new QDLStem(); - for (Object key : arg.keySet()) { - Object obj = arg.get(key); - String result; - String inString = (String) obj; - if (!(obj instanceof String)) { - out.putLongOrString(key, obj); - continue; - } - try { - if (usePrivateKey) { - if (jsonWebKey.privateKey == null) { - throw new IllegalArgumentException("This is not a private key"); - } - result = DecryptUtils.encryptPrivate(jsonWebKey.type,jsonWebKey.privateKey, inString); - } else { - if (jsonWebKey.publicKey == null) { - throw new IllegalArgumentException("Invalid public key"); - } - result = DecryptUtils.encryptPublic(jsonWebKey.type,jsonWebKey.publicKey, inString); - } - out.putLongOrString(key, result); - } catch (GeneralSecurityException gsx) { - // Clean up exception with a better message - throw new IllegalArgumentException(getName() + " could not encrypt argument for key='" + key + "' with value ='" + obj + "'"); - } - } + + QDLStem out = encryptOrDecryptStem(rightArg, cipher, jsonWebKey, usePrivateKey, false); if (stringArg) { return out.getString(0L); } return out; } +/* + crypto:=j_load('crypto') + rsa. := crypto#create_key() + crypto#encrypt(rsa., 'woof woof') + crypto#encrypt({'key':rsa.,'cipher':'DES'}, 'woof woof') + + set_test := crypto#encrypt(rsa.,{'a',{'b'}}) + crypto#decrypt(rsa., set_test) + */ @Override public List getDocumentation(int argCount) { List dd = new ArrayList<>(); switch (argCount) { case 2: - dd.add(getName() + "(key., arg|arg.) - encrypt a string or stem of them with the private key"); + dd.add(getName() + "(key., arg|arg.) - encrypt a string or stem of them. If the key is symmetric, do symmetric encryption, otherwise encrypt with the private key"); break; case 3: dd.add(getName() + "(key., arg|arg., use_private) - encrypt a string or stem of them with the private key if use_private is true"); dd.add(" or use the public key if false. Default is true"); break; } - dd.add("key. - the RSA key to use. Only RSA keys are supported at this time."); + dd.add("key. - the RSA or symmetric key to use. N.B. Elliptic keys are not supported at this time."); dd.add("arg|arg. - a string or a stem of strings"); if (argCount == 3) { dd.add("use_private - use the private key (if true, this is the default) and the public key if false"); } - dd.add("NOTE: You can only encrypt a string that has fewer bits than the key."); - dd.add("\nE.g.\nIf your key is 1024 bits, then 1024/8 = 128 bytes or characters is the max length string.\n"); + dd.add("NOTE: You can only encrypt a string with an RSA key that has fewer bits than the key."); + dd.add("Symmetric encryption, however, is unlimited"); + dd.add("\nE.g.\nIf RSA your key is 1024 bits, then 1024/8 = 128 bytes or characters is the max length string.\n"); dd.add("Note that the result is base 64 encoded, since the result of the encryption will be an array of bytes."); dd.add("One final reminder is that if encrypt/decrypt with one key and decrypt/encrypt with the" + "\nother or you will get an error"); dd.add("E.g."); dd.add(" " + getName() + "(key., 'marizy doats')"); - dd.add("(whole bunch of base 64stuff that depends on the key)"); + dd.add("(whole bunch of base 64 stuff that depends on the key)"); dd.add("Since this was encrypted with the private key, you would need to specify using the"); dd.add("public key in " + DECRYPT_NAME + " (which is, incidentally, the default there)."); + dd.add("\nE.g. Symmetric example"); + dd.add("Here, a symmetric key (AES) is created and used."); + dd.add(" aes. := crypto#create_key({'type':'AES','alg':'A256GCM','length':512})\n" + + " crypto#encrypt(aes., 'woof woof woof') \n" + + "67dmKZ6lqHwSt-mIZGs\n" + + " crypto#decrypt(aes., '67dmKZ6lqHwSt-mIZGs')\n" + + "woof woof woof\n"); + return dd; + } + } + /** + * Encrypt or decrypt a stem. This will skip anything that is not a string or stem + * and will do the correct recursion to get everything in the stem + * + * @param rightArg + * @param cipher + * @param jsonWebKey + * @param usePrivateKey + * @param doDecrypt + * @return + */ + protected QDLStem encryptOrDecryptStem(QDLStem rightArg, + String cipher, + JSONWebKey jsonWebKey, + boolean usePrivateKey, + boolean doDecrypt) { - return dd; + QDLStem outStem = new QDLStem(); + for (Object key : rightArg.keySet()) { + Object obj = rightArg.get(key); + String result; + if (obj instanceof QDLStem) { + outStem.putLongOrString(key, encryptOrDecryptStem((QDLStem) obj, cipher, jsonWebKey, usePrivateKey, doDecrypt)); + } else { + if (obj instanceof String) { + String inString = (String) obj; + + try { + if (usePrivateKey) { + if (doDecrypt) { + result = DecryptUtils.decryptPrivate(cipher, jsonWebKey.privateKey, inString); + } else { + result = DecryptUtils.encryptPrivate(cipher, jsonWebKey.privateKey, inString); + } + } else { + if (doDecrypt) { + result = DecryptUtils.decryptPublic(cipher, jsonWebKey.publicKey, inString); + } else { + result = DecryptUtils.encryptPublic(cipher, jsonWebKey.publicKey, inString); + } + } + outStem.putLongOrString(key, result); + } catch (RuntimeException rt) { + throw rt; + } catch (Throwable gsx) { + // Clean up exception with a better message + throw new IllegalArgumentException((doDecrypt ? DECRYPT_NAME : ENCRYPT_NAME) + " could not process argument for key='" + key + "' with value ='" + obj + "' (" + gsx.getMessage() + ")"); + } + } else { + if (obj instanceof QDLSet) { + outStem.putLongOrString(key, encryptOrDecryptSet((QDLSet) obj, cipher, jsonWebKey, usePrivateKey, doDecrypt)); + + } else { + outStem.putLongOrString(key, obj); + } + } + } } + return outStem; } + protected QDLSet encryptOrDecryptSet(QDLSet rightArg, + String cipher, + JSONWebKey jsonWebKey, + boolean usePrivateKey, + boolean doDecrypt) { + + QDLSet outSet = new QDLSet(); + for (Object obj : rightArg) { + String result; + if (obj instanceof QDLStem) { + outSet.add(encryptOrDecryptStem((QDLStem) obj, cipher, jsonWebKey, usePrivateKey, doDecrypt)); + } else { + if (obj instanceof String) { + String inString = (String) obj; + + try { + if (usePrivateKey) { + if (doDecrypt) { + result = DecryptUtils.decryptPrivate(cipher, jsonWebKey.privateKey, inString); + } else { + result = DecryptUtils.encryptPrivate(cipher, jsonWebKey.privateKey, inString); + } + } else { + if (doDecrypt) { + result = DecryptUtils.decryptPublic(cipher, jsonWebKey.publicKey, inString); + } else { + result = DecryptUtils.encryptPublic(cipher, jsonWebKey.publicKey, inString); + } + } + outSet.add(result); + } catch (RuntimeException rt) { + throw rt; + } catch (Throwable gsx) { + // Clean up exception with a better message + throw new IllegalArgumentException((doDecrypt ? DECRYPT_NAME : ENCRYPT_NAME) + " could not process argument for set element ='" + obj + "' (" + gsx.getMessage() + ")"); + } + } else { + if (obj instanceof QDLSet) { + outSet.add(encryptOrDecryptSet((QDLSet) obj, cipher, jsonWebKey, usePrivateKey, doDecrypt)); + } else { + outSet.add(obj); + } + } + } + } + return outSet; + } + + /* + crypto := j_load('crypto'); + aes. := crypto#create_key({'type':'AES','alg':'A256GCM','length':512}) + crypto#encrypt(aes., 'woof woof woof') + 67dmKZ6lqHwSt-mIZGs + crypto#decrypt(aes., '67dmKZ6lqHwSt-mIZGs') + woof woof woof + + // set test + crypto:=j_load('crypto') + rsa. := crypto#create_key() + set_test := crypto#encrypt(rsa., {'a',{'b'}}) + crypto#decrypt(rsa., set_test) == {'a',{'b'}}; //returns true + + + crypto := j_load('crypto'); + rsa. := crypto#create_key(); + z. := crypto#encrypt(rsa., {'a':{'b':'foo'}}) + crypto#decrypt(rsa., z.) + + */ public static final String DECRYPT_NAME = "decrypt"; public class Decrypt implements QDLFunction { @@ -455,7 +875,10 @@ public Object evaluate(Object[] objects, State state) { if (!(objects[0] instanceof QDLStem)) { throw new IllegalArgumentException("The first argument of " + getName() + " must be a stem"); } - JSONWebKey jsonWebKey = getKeys((QDLStem) objects[0]); + QDLStem leftArg = (QDLStem) objects[0]; + if (leftArg.containsKey("kty") && leftArg.getString("kty").equals("oct")) { + return sDeOrEnCrypt(objects, state, false, getName()); + } QDLStem arg = null; boolean usePrivateKey = false; boolean stringArg = false; @@ -471,53 +894,44 @@ public Object evaluate(Object[] objects, State state) { arg.put(0L, objects[1]); } - if (!gotOne) { - return objects[1]; // nix to do - } if (objects.length == 3) { if (!(objects[2] instanceof Boolean)) { throw new IllegalArgumentException("the last argument of " + getName() + " must be a boolean. Default is true"); } usePrivateKey = (Boolean) objects[2]; } - QDLStem out = new QDLStem(); - for (Object key : arg.keySet()) { - Object obj = arg.get(key); - String result; - String inString = (String) obj; - if (!(obj instanceof String)) { - out.putLongOrString(key, obj); - continue; + JSONWebKey jsonWebKey = getKeys(leftArg); + if (usePrivateKey) { + if (jsonWebKey.privateKey == null) { + throw new IllegalArgumentException("Missing private key"); } - try { - if (usePrivateKey) { - if (jsonWebKey.privateKey == null) { - throw new IllegalArgumentException("This is not a private key"); - } - result = DecryptUtils.decryptPrivate(jsonWebKey.type ,jsonWebKey.privateKey, inString); - } else { - if (jsonWebKey.publicKey == null) { - throw new IllegalArgumentException("Invalid public key"); - } - result = DecryptUtils.decryptPublic(jsonWebKey.type, jsonWebKey.publicKey, inString); - } - out.putLongOrString(key, result); - } catch (GeneralSecurityException | UnsupportedEncodingException gsx) { - throw new IllegalArgumentException(getName() + " could not encrypt argument for key='" + key + "' with value ='" + obj + "'"); + } else { + if (jsonWebKey.publicKey == null) { + throw new IllegalArgumentException("Missing public key"); } } + String cipher = "RSA"; // There are several available. + if (objects[1] instanceof QDLSet) { + return encryptOrDecryptSet((QDLSet) objects[1], cipher, jsonWebKey, usePrivateKey, true); + } + + if (!gotOne) { + return objects[1]; // nix to do + } + QDLStem out = encryptOrDecryptStem(arg, cipher, jsonWebKey, usePrivateKey, true); if (stringArg) { return out.getString(0L); } return out; } + @Override public List getDocumentation(int argCount) { List doxx = new ArrayList<>(); switch (argCount) { case 2: - doxx.add(getName() + "(key., arg|arg.) - decrypt the argument using the public key"); + doxx.add(getName() + "(key., arg|arg.) - decrypt the argument. If the key is symmetric, use that, otherwise use the public key"); break; case 3: doxx.add(getName() + "(key., arg|arg., use_private) - decrypt the argument using the private key if use_private == true"); @@ -561,77 +975,6 @@ protected QDLStem webKeyToStem(JSONWebKey jsonWebKey) { return keys; } - public static final String SYMM_ENCRYPT_NAME = "s_encrypt"; - - public class SymmetricEncrypt implements QDLFunction { - @Override - public String getName() { - return SYMM_ENCRYPT_NAME; - } - - @Override - public int[] getArgCount() { - return new int[]{2}; - } - - @Override - public Object evaluate(Object[] objects, State state) { - return sDeOrEnCrypt(objects, state, true, getName()); - } - - List dd = new ArrayList<>(); - - @Override - public List getDocumentation(int argCount) { - if (dd.isEmpty()) { - dd.add(getName() + "(key, target) - Symmetric encryption on the target, returning a base 64 encoded byte string."); - dd.add("Note 1: target may be a string or stem of them"); - dd.add("Note 2: in QDL it is easy to make a key with " + MathEvaluator.RANDOM_STRING + "(n), n*8 is the bit count."); - dd.add("\nE.g."); - dd.add("key := " + MathEvaluator.RANDOM_STRING + "(64); // 64*8 == 512 bit strength"); - dd.add("target := 'mairzy doats and dozey doats';"); - dd.add(" " + getName() + "(key, target)"); - dd.add("HUhqqoHJc3-AqWbRGbS-6V2KnXQ26tiR9ivkmA"); - dd.add("//Note that the encrypted output will vary since the key is random."); - dd.add(" " + SYMM_DECRYPT_NAME + "(key, 'HUhqqoHJc3-AqWbRGbS-6V2KnXQ26tiR9ivkmA')"); - dd.add("mairzy doats and dozey doats"); - } - return dd; - } - } - - //module_import(module_load(info('lib').'crypto', 'java')) - public static final String SYMM_DECRYPT_NAME = "s_decrypt"; - - public class SymmetricDecrypt implements QDLFunction { - @Override - public String getName() { - return SYMM_DECRYPT_NAME; - } - - @Override - public int[] getArgCount() { - return new int[]{2}; - } - - @Override - public Object evaluate(Object[] objects, State state) { - return sDeOrEnCrypt(objects, state, false, getName()); - } - - List dd = new ArrayList<>(); - - @Override - public List getDocumentation(int argCount) { - if (dd.isEmpty()) { - dd.add(getName() + "(key, target) - Symmetric key decryption for an encrypted, base 64 byte-string."); - dd.add("This returns the original string."); - dd.add("See also:" + SYMM_ENCRYPT_NAME); - } - return dd; - } - } - /** * Utility for symmetric key encode/decode. * @@ -647,13 +990,41 @@ protected String decodeString(byte[] key, String s, boolean isEncrypt) { return DecryptUtils.sDecrypt(key, s); } + /* + crypto := j_load('crypto'); + aes. := crypto#create_key({'type':'AES','alg':'A256GCM','length':512}) + crypto#encrypt(aes., 'woof woof woof') +kazrnybI9mX73qv6NqA + crypto#encrypt(aes., {'a':'woof woof woof'}) +{a:kazrnybI9mX73qv6NqA} + crypto#encrypt(aes., {'b',{'a':'woof woof woof'}}) +{b,{a:woof woof woof}} + crypto#encrypt(aes., {'woof woof woof'}) +{woof woof woof} + crypto#encrypt(aes., {'b',{'a':'woof woof woof'}}) + */ public Object sDeOrEnCrypt(Object[] objects, State state, boolean isEncrypt, String name) { - if (!(objects[0] instanceof String)) { - throw new IllegalArgumentException("the first argument to " + name + " must be a base64 encoded key"); + byte[] key = null; + if (objects[0] instanceof QDLStem) { + // check that it is a JWK of type octet + QDLStem sKey = (QDLStem) objects[0]; + if (sKey.containsKey("kty")) { + if (!sKey.getString("kty").equals("oct")) { + throw new IllegalArgumentException("Incorrect key type. Must be of type 'oct' (octet-encoded)"); + } + if (sKey.containsKey("k")) { + key = Base64.decodeBase64(sKey.getString("k")); + } else { + throw new IllegalArgumentException("Incorrect key format: missing 'k' entry for bytes"); + } + } + } else { + if (!(objects[0] instanceof String)) { + throw new IllegalArgumentException("the first argument to " + name + " must be a base64 encoded key"); + } + key = Base64.decodeBase64((String) objects[0]); } - byte[] key = Base64.decodeBase64((String) objects[0]); QDLStem inStem = null; - QDLStem outStem = new QDLStem(); boolean isStringArg = false; if (objects[1] instanceof String) { isStringArg = true; @@ -663,24 +1034,63 @@ public Object sDeOrEnCrypt(Object[] objects, State state, boolean isEncrypt, Str if (objects[1] instanceof QDLStem) { inStem = (QDLStem) objects[1]; } + + if (objects[1] instanceof QDLSet) { + return sDeOrEncryptSet((QDLSet) objects[1], isEncrypt, key); + } if (inStem == null) { - throw new IllegalArgumentException("second argument of " + name + " must be a stem or string."); + return objects[1]; // nix to do + } + QDLStem outStem = sDeOrEncryptStem(inStem, isEncrypt, key); + if (isStringArg) { + return outStem.get(0L); } + return outStem; + } + + private QDLStem sDeOrEncryptStem(QDLStem inStem, boolean isEncrypt, byte[] key) { + QDLStem outStem = new QDLStem(); for (Object stemKey : inStem.keySet()) { Object obj = inStem.get(stemKey); if (obj instanceof String) { String target = (String) obj; outStem.putLongOrString(stemKey, decodeString(key, target, isEncrypt)); } else { - outStem.putLongOrString(stemKey, outStem);// don't touch if not string + if (obj instanceof QDLStem) { + outStem.putLongOrString(stemKey, sDeOrEncryptStem((QDLStem) obj, isEncrypt, key));// don't touch if not string + } else { + if (obj instanceof QDLSet) { + outStem.putLongOrString(stemKey, sDeOrEncryptSet((QDLSet) obj, isEncrypt, key));// don't touch if not string + } else { + outStem.putLongOrString(stemKey, obj);// don't touch if not string + } + } } } - if (isStringArg) { - return outStem.get(0L); - } return outStem; } + private QDLSet sDeOrEncryptSet(QDLSet inSet, boolean isEncrypt, byte[] key) { + QDLSet outSet = new QDLSet(); + for (Object obj : inSet) { + if (obj instanceof String) { + String target = (String) obj; + outSet.add(decodeString(key, target, isEncrypt)); + } else { + if (obj instanceof QDLSet) { + outSet.add(sDeOrEncryptSet((QDLSet) obj, isEncrypt, key));// don't touch if not string + } else { + if (obj instanceof QDLStem) { + outSet.add(sDeOrEncryptStem((QDLStem) obj, isEncrypt, key));// don't touch if not string + } else { + outSet.add(obj); // do nothing + } + } + } + } + return outSet; + } + /** * Is the stem a single key or a stem of keys? This is a simple-minded test and just * checks if a required value for the keyis at the top level. @@ -695,6 +1105,23 @@ protected boolean isSingleKey(QDLStem stem) { SecureRandom secureRandom = new SecureRandom(); + protected String getRandomID() { + return getRandomID(8); + } + + /** + * Creates a random id as an (upper case) hex number. + * @param byteCount + * @return + */ + protected String getRandomID(int byteCount) { + byte[] bytes = new byte[byteCount]; + secureRandom.nextBytes(bytes); + BigInteger bigInt = new BigInteger(bytes); + bigInt = bigInt.abs(); + return bigInt.toString(16).toUpperCase(); + } + @Override public JSONObject serializeToJSON() { return null; @@ -704,4 +1131,364 @@ public JSONObject serializeToJSON() { public void deserializeFromJSON(JSONObject json) { } + + public static String IMPORT_CERT = "import_x509"; + + public class ImportCert implements QDLFunction { + @Override + public String getName() { + return IMPORT_CERT; + } + + /* + crypto := j_load('crypto'); + cert. := crypto#import_x509('/home/ncsa/temp/cert.pem'); + print(cert.); + + */ + @Override + public int[] getArgCount() { + return new int[]{1}; + } + + @Override + public Object evaluate(Object[] objects, State state) throws Throwable { + String path = (String) objects[0]; + QDLStem out = new QDLStem(); + String rawCert = QDLFileUtil.readTextFile(state, path); + X509Certificate[] certs = CertUtil.fromX509PEM(rawCert); + if (certs.length == 1) { + QDLStem outStem = certToStem(certs[0]); + outStem.put("encoded", rawCert); + return outStem; + } + for (X509Certificate cert : certs) { + out.getQDLList().add(certToStem(cert)); + } + out.getStem(0L).put("encoded", rawCert); + return out; + } + + public String hexToASCII(String hex) { + // initialize the ASCII code string as empty. + String ascii = ""; + + for (int i = 0; i < hex.length(); i += 2) { + + // extract two characters from hex string + String part = hex.substring(i, i + 2); + + // change it into base 16 and typecast as the character + char ch = (char) Integer.parseInt(part, 16); + + // add this char to final ASCII string + ascii = ascii + ch; + } + + return ascii; + } + + /* + crypto := j_load('crypto') + print(cert.:=crypto#import_x509('/home/ncsa/Downloads/github-com.pem')) + crypto#read_oid(cert., {'foo':'2.5.29.19'}) + decode(crypto#read_oid(cert., '1.3.6.1.4.1.5923.1.1.1.6')) + + */ + protected QDLStem certToStem(X509Certificate x509Certificate) throws CertificateEncodingException { + QDLStem out = new QDLStem(); + QDLStem subject = new QDLStem(); + subject.put("x500", x509Certificate.getSubjectX500Principal().getName()); + subject.put("dn", x509Certificate.getSubjectDN().getName()); + try { + if (x509Certificate.getSubjectAlternativeNames() != null) { + QDLStem altNames = processAltNames(x509Certificate.getSubjectAlternativeNames()); + if (altNames != null) { + subject.put("alt_names", altNames); + } + } + } catch (CertificateParsingException e) { + // throw new RuntimeException(e); + } + QDLStem criticalOIDS = new QDLStem(); + for (String x : x509Certificate.getCriticalExtensionOIDs()) { + criticalOIDS.getQDLList().add(x); + } + QDLStem noncriticalOIDS = new QDLStem(); + for (String x : x509Certificate.getNonCriticalExtensionOIDs()) { + noncriticalOIDS.getQDLList().add(x); + } + QDLStem oids = new QDLStem(); + oids.put("critical", criticalOIDS); + oids.put("noncritical", noncriticalOIDS); + out.put("oids", oids); + out.put("subject", subject); + QDLStem issuer = new QDLStem(); + issuer.put("x500", x509Certificate.getIssuerX500Principal().getName()); + issuer.put("dn", x509Certificate.getIssuerDN().getName()); + if (x509Certificate.getIssuerUniqueID() != null) { + + QDLStem issuerUniqueID = new QDLStem(); + ArrayList list = new ArrayList(); + list.add(x509Certificate.getIssuerUniqueID()); + issuerUniqueID.getQDLList().setArrayList(list); + issuer.put("unique_id", issuerUniqueID); + } + try { + if (x509Certificate.getSubjectAlternativeNames() != null) { + QDLStem altNames = processAltNames(x509Certificate.getSubjectAlternativeNames()); + if (altNames != null) { + issuer.put("alt_names", altNames); + } + } + } catch (CertificateParsingException e) { + // throw new RuntimeException(e); + } + out.put("issuer", issuer); + out.put("not_before", x509Certificate.getNotBefore().getTime()); + out.put("not_after", x509Certificate.getNotAfter().getTime()); + QDLStem alg = new QDLStem(); + alg.put("name", x509Certificate.getSigAlgName()); + alg.put("oid", x509Certificate.getSigAlgOID()); + if (x509Certificate.getSigAlgParams() != null) { + alg.put("parameters", Base64.encodeBase64URLSafe(x509Certificate.getSigAlgParams())); + } + out.put("algorithm", alg); + out.put("serial_number", x509Certificate.getSerialNumber().toString()); + + out.put("signature", Base64.encodeBase64URLSafeString(x509Certificate.getSignature())); + out.put("version", "v" + x509Certificate.getVersion()); // standard way to write it + String eppn = CertUtil.getEPPN(x509Certificate); + if (eppn != null) { + out.put("eppn", eppn); + } + String email = CertUtil.getEmail(x509Certificate); + if (email != null) { + out.put("email", email); + } + PublicKey publicKey = x509Certificate.getPublicKey(); + JWK jwk = getJwk(publicKey); + if (jwk != null) { + JSONWebKey jsonWebKey = new JSONWebKey(jwk); + QDLStem pKeyStem = webKeyToStem(jsonWebKey); + out.put("public_key", pKeyStem); + } + return out; + } + + /** + * Take a collection of lists of alt names and convert to something understandable. + * + * @param lists + * @return + */ + protected QDLStem processAltNames(Collection> lists) { + if (lists == null || lists.size() == 0) { + return null; + } + QDLStem altNames = new QDLStem(); + for (List o : lists) { + String[] altName = altName(o); + altNames.put(altName[0], altName[1]); + } + return altNames; + } + + protected String[] altName(List rawList) { + int oid = (int) rawList.get(0); + String[] altNames = new String[2]; + switch (oid) { + case 0: + altNames[0] = "otherName"; + break; + case 1: + altNames[0] = "rfc822Name"; + break; + case 2: + altNames[0] = "dNSName"; + break; + case 3: + altNames[0] = "x400Address"; + break; + case 4: + altNames[0] = "directoryName"; + break; + case 5: + altNames[0] = "ediPartyName"; + break; + case 6: + altNames[0] = "uniformResourceIdentifier"; + break; + case 7: + altNames[0] = "registeredID"; + break; + } + altNames[1] = processAltName(rawList.get(1)); + return altNames; + } + + protected String processAltName(Object o) { + if (o instanceof byte[]) { + Base64.encodeBase64URLSafeString((byte[]) o); + } + return o.toString(); + } + + /* + GeneralName ::= CHOICE { + otherName [0] OtherName, + rfc822Name [1] IA5String, + dNSName [2] IA5String, + x400Address [3] ORAddress, + directoryName [4] Name, + ediPartyName [5] EDIPartyName, + uniformResourceIdentifier [6] IA5String, + iPAddress [7] OCTET STRING, + registeredID [8] OBJECT IDENTIFIER} + + */ + @Override + public List getDocumentation(int argCount) { + List dd = new ArrayList<>(); + dd.add(getName() + "(full_path) - read a cert or chain of certs"); + dd.add("full_path = full path to the file."); + dd.add("This will read an X 509 cert and return a stem of its attributes"); + dd.add("Note that you cannot change a cert nor write one!"); + dd.add("This is not intended for certificate management, but just to let you view one easily"); + dd.add("At this point, only RSA public keys will be returned."); + return dd; + } + } + + public static final String READ_OID = "read_oid"; + + public class ReadOID implements QDLFunction { + @Override + public String getName() { + return READ_OID; + } + + @Override + public int[] getArgCount() { + return new int[]{2}; + } + + @Override + public Object evaluate(Object[] objects, State state) throws Throwable { + QDLStem certStem = (QDLStem) objects[0]; + if (!certStem.containsKey("encoded")) { + throw new IllegalStateException("certs must contain encoded key"); + } + String cert = certStem.getString("encoded"); + X509Certificate[] certs = CertUtil.fromX509PEM(cert); + // better be one? + boolean isScalar = false; + String oid = null; + QDLStem oidStem = null; + if (objects[1] instanceof String) { + oid = (String) objects[1]; + isScalar = true; + } else { + if (objects[1] instanceof QDLStem) { + oidStem = (QDLStem) objects[1]; + + } else { + throw new IllegalArgumentException(getName() + "requires a string or stem as the second argument"); + } + } + X509Certificate x509Certificate = certs[0]; + QDLStem outStem = new QDLStem(); + if (isScalar) { + byte[] bb = x509Certificate.getExtensionValue(oid); + if (bb == null) { + return QDLNull.getInstance(); + } + return Base64.encodeBase64URLSafeString(bb); + } + for (Object key : oidStem.keySet()) { + String oidKey; + byte[] bb; + if (key instanceof Long) { + oidKey = oidStem.getString((Long) key); + } else { + oidKey = oidStem.getString((String) key); + } + bb = x509Certificate.getExtensionValue(oidKey); + if (bb == null) { + outStem.putLongOrString(key, QDLNull.getInstance()); + } else { + outStem.putLongOrString(key, Base64.encodeBase64URLSafeString(bb)); + } + } + return outStem; + } + + @Override + public List getDocumentation(int argCount) { + List dd = new ArrayList<>(); + dd.add(getName() + "(cert., oid | oids.) - get the given OIDs from a given cert."); + dd.add("cert. - a single X509 certificate to be probed."); + dd.add(" oid - a string that is the oid (object id), e.g. '2.5.29.15'"); + dd.add("oids. - a stem of oids whose keys are the return values. Only string-valued OIDs are supported."); + dd.add("You pass in either an oid or stem of them"); + dd.add("This returns the base 64 encoded octet stream. Best we can do in general..."); + dd.add("If there is no such value, a null is returned."); + dd.add("An OID (object identifier) is a bit of X 509 voodoo that allows for"); + dd.add("addressing attributes. These are very specific and not standardizes, hence are. "); + dd.add("bona fide low-level operations, but often the only way to get certain custom values"); + dd.add("E.g. to get the EPPN (if present) from a cert"); + dd.add(" " + getName() + "(cert., {'eppn':'1.3.6.1.4.1.5923.1.1.1.6'}"); + dd.add("{eppn:bob@bigstate.edu}"); + dd.add("In this case the OID refers to the EPPN (EduPersonPrincipalName"); + dd.add("\n\nA typical document list these is at https://software.internet2.edu/eduperson/internet2-mace-dir-eduperson-201602.html"); + dd.add("\nE.g."); + dd.add(" crypto#read_oid(cert., cert.oids.critical)"); + dd.add("[BAQDAgeA,BAIwAA]"); + dd.add("A list of the critical OIDs for this cert. Decoding them, really yields nothing:"); + dd.add("[\u0004\u0004\u0003\u0002\u0007�,\u0004\u00020]"); + dd.add("Looking them up, these are (2.5.29.15) the id-ce-keyUsage, and (2.5.29.19) the id-ce-basicConstraints "); + dd.add("and interpreting them requires consuming the individual bits."); + dd.add("\n\nNotes:"); + dd.add("* if there is no such value, then it is omitted from the result"); + dd.add("* this is an expensive operation, so it is best to have all the OIDs you need"); + dd.add(" done at once, rather than getting each value in a loop"); + return dd; + } + } + + public static final String CREATE_CERT_REQUEST = "create_cert_request"; + + public class CreateCertRequest implements QDLFunction { + @Override + public String getName() { + return CREATE_CERT_REQUEST; + } + + @Override + public int[] getArgCount() { + return new int[]{1}; + } + + @Override + public Object evaluate(Object[] objects, State state) throws Throwable { + + // MyCertUtil.createCertRequest(MyCertUtil.createCertRequest(null)); + return null; + } + + @Override + public List getDocumentation(int argCount) { + List dd = new ArrayList<>(); + dd.add(getName() + "(params.) - create a cert request with the given parameters"); + dd.add("params. - a stem of parameters with the following keys"); + dd.add("----------------------------------"); + dd.add(" key = RSA key that is a JWK"); + dd.add(" dn = the distinguished name. Default is " + CertUtil.DEFAULT_PKCS10_DISTINGUISHED_NAME); + dd.add(" cn = the country. Default is USA"); + dd.add(" ou = organizational unit. Default is OU."); + dd.add("sig_alg = signature algorithm. Default is " + CertUtil.DEFAULT_PKCS10_SIGNATURE_ALGORITHM); + dd.add(" on = organizational name. Default is OU"); + return dd; + } + } } diff --git a/language/src/main/java/org/qdl_lang/extensions/crypto/CryptoModule.java b/language/src/main/java/org/qdl_lang/extensions/crypto/CryptoModule.java index 51fa106aa..73208e3b5 100644 --- a/language/src/main/java/org/qdl_lang/extensions/crypto/CryptoModule.java +++ b/language/src/main/java/org/qdl_lang/extensions/crypto/CryptoModule.java @@ -29,13 +29,17 @@ public Module newInstance(State state) { ArrayList funcs = new ArrayList<>(); funcs.add(crypto.new ImportJWKS()); + funcs.add(crypto.new ImportPKCS()); + funcs.add(crypto.new ImportCert()); funcs.add(crypto.new ExportJWKS()); + funcs.add(crypto.new ExportPKCS()); funcs.add(crypto.new Encrypt()); funcs.add(crypto.new Decrypt()); funcs.add(crypto.new CreateKey()); funcs.add(crypto.new GetPublicKey()); - funcs.add(crypto.new SymmetricEncrypt()); - funcs.add(crypto.new SymmetricDecrypt()); + //funcs.add(crypto.new SymmetricEncrypt()); + //funcs.add(crypto.new SymmetricDecrypt()); + funcs.add(crypto.new ReadOID()); cryptoModule.addFunctions(funcs); if (state != null) { cryptoModule.init(state); @@ -49,10 +53,10 @@ public Module newInstance(State state) { @Override public List getDescription() { if (dd.isEmpty()) { - dd.add("QDL's crypto graphic module. This has a variety of operations possible"); - dd.add("it will allow you to create a RSA keys (so includes a public and private key)"); + dd.add("QDL's crypto graphic module. This has a variety of operations possible."); + dd.add("It will allow you to create a Both Elliptic and RSA keys (so includes a public and private key)"); dd.add("and encrypt both strings and stems of strings using these or symmetric keys."); - dd.add("Note that if you de/en-crypt with one RSA key, you en/de-crypt with the other:"); + dd.add("Note that if you de/en-crypt with one key, you en/de-crypt with the other:"); dd.add("E.g."); dd.add("key. := " + Crypto.CREATE_KEY_NAME + "(2048); // create 2048 bit key pair"); dd.add(" " + Crypto.DECRYPT_NAME + "(key., " + Crypto.ENCRYPT_NAME + "(key., ['a','b']))\n" + @@ -63,6 +67,9 @@ public List getDescription() { dd.add("You may have individual keys or have sets of them. A *key set* is a stem"); dd.add("of keys whose id is used as its key in the stem. Operations generally work for"); dd.add("individual keys or sets of them."); + dd.add("\n\nAdditionally, you may import/export individual keys to various PKCS pem"); + dd.add("formats, PKCS 1, 8 and X509 (for public keys)."); + dd.add( "See also:" + Crypto.IMPORT_PKCS_NAME + " and " + Crypto.EXPORT_PKCS_NAME + " for details."); } return dd; } diff --git a/language/src/main/java/org/qdl_lang/extensions/http/HTTPClient.java b/language/src/main/java/org/qdl_lang/extensions/http/HTTPClient.java index 8ada9ab67..604c15e47 100644 --- a/language/src/main/java/org/qdl_lang/extensions/http/HTTPClient.java +++ b/language/src/main/java/org/qdl_lang/extensions/http/HTTPClient.java @@ -229,12 +229,18 @@ public int[] getArgCount() { public Object evaluate(Object[] objects, State state) throws Throwable { checkInit(); String r = null; + // Fix https://github.com/ncsa/qdl/issues/88 + Object[] obj2 = objects; if(objects.length == 1){ - if(!(objects[0] instanceof QDLStem)){ - throw new IllegalArgumentException(getName() + " requires a stem if there is a single argument."); + if(objects[0] instanceof String){ + obj2 = new Object[]{objects[0], new QDLStem()}; + }else{ + if(!(objects[0] instanceof QDLStem)){ + throw new IllegalArgumentException(getName() + " requires a stem if there is a single argument."); + } } } - r = paramsToRequest(objects); + r = paramsToRequest(obj2); HttpGet request = new HttpGet(r); if ((headers != null) && !headers.isEmpty()) { for (Object key : headers.keySet()) { @@ -254,7 +260,7 @@ public List getDocumentation(int argCount) { doxx.add(getName() + "() - do an HTTP GET to the host with the current headers and no parameters."); break; case 1: - doxx.add(getName() + "(parameters.) - do an HTTP GET to the host with the current headers and use the parameters."); + doxx.add(getName() + "(uri_path | parameters.) - do an HTTP GET to the host with the current headers and use path ot the parameters."); break; case 2: doxx.add(getName() + "(uri_path, parameters.) - do an HTTP GET to host + uri_path with the current headers and use the parameters."); diff --git a/tests/pom.xml b/tests/pom.xml index 978785ebe..7c9ea4f38 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -41,10 +41,15 @@ test --> - + + + com.mysql + mysql-connector-j + 9.1.0 org.apache.derby diff --git a/tests/src/test/java/org/qdl_lang/ModuleTests.java b/tests/src/test/java/org/qdl_lang/ModuleTests.java index 655e8cbdc..c5ba06119 100644 --- a/tests/src/test/java/org/qdl_lang/ModuleTests.java +++ b/tests/src/test/java/org/qdl_lang/ModuleTests.java @@ -278,7 +278,7 @@ public void testBasicVisibility() throws Throwable { addLine(script, "w(z)->z^2;"); addLine(script, "module['A:Y'][f(x)->w(2*x);];"); addLine(script, "y:=import('A:Y');"); - addLine(script, "y#f(3);"); // should fail since w is not visibile. + addLine(script, "y#f(3);"); // should fail since w is not visible. QDLInterpreter interpreter = new QDLInterpreter(null, state); try { interpreter.execute(script.toString());