Initial commit

This commit is contained in:
Paul Schaub 2024-11-14 01:55:13 +01:00
commit 1d697eb682
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
18 changed files with 742 additions and 0 deletions

38
.gitignore vendored Normal file
View file

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

3
.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

11
.idea/encodings.xml generated Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/bcsop-cli/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bcsop-cli/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bcsop/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bcsop/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml generated Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

124
.idea/uiDesigner.xml generated Normal file
View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

32
bcsop-cli/pom.xml Normal file
View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.pgpainless</groupId>
<artifactId>bc-sop</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>bcsop-cli</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.pgpainless</groupId>
<artifactId>bcsop</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.pgpainless</groupId>
<artifactId>sop-java-picocli</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,7 @@
package org.pgpainless;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

35
bcsop/pom.xml Normal file
View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.pgpainless</groupId>
<artifactId>bc-sop</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>bcsop</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.pgpainless</groupId>
<artifactId>sop-java</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk18on</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,99 @@
package org.pgpainless.bouncycastle.sop;
import org.jetbrains.annotations.NotNull;
import org.pgpainless.bouncycastle.sop.operation.*;
import sop.SOP;
import sop.operation.*;
public class BouncyCastleSOP implements SOP {
@NotNull
@Override
public Armor armor() {
return new BCArmor();
}
@NotNull
@Override
public GenerateKey generateKey() {
return null;
}
@NotNull
@Override
public ExtractCert extractCert() {
return new BCExtractCert();
}
@NotNull
@Override
public DetachedSign detachedSign() {
return null;
}
@NotNull
@Override
public InlineSign inlineSign() {
return null;
}
@NotNull
@Override
public InlineDetach inlineDetach() {
return null;
}
@NotNull
@Override
public Encrypt encrypt() {
return null;
}
@NotNull
@Override
public Decrypt decrypt() {
return null;
}
@NotNull
@Override
public Dearmor dearmor() {
return new BCDearmor();
}
@NotNull
@Override
public ListProfiles listProfiles() {
return new BCListProfiles();
}
@NotNull
@Override
public RevokeKey revokeKey() {
return null;
}
@NotNull
@Override
public ChangeKeyPassword changeKeyPassword() {
return null;
}
@NotNull
@Override
public Version version() {
return new BCVersion();
}
@NotNull
@Override
public DetachedVerify detachedVerify() {
return null;
}
@NotNull
@Override
public InlineVerify inlineVerify() {
return null;
}
}

View file

@ -0,0 +1,37 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.util.io.Streams;
import org.jetbrains.annotations.NotNull;
import sop.Ready;
import sop.enums.ArmorLabel;
import sop.exception.SOPGPException;
import sop.operation.Armor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class BCArmor implements Armor {
@NotNull
@Override
public Ready data(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException {
return new Ready() {
@Override
public void writeTo(@NotNull OutputStream outputStream) throws IOException {
ArmoredOutputStream aOut = ArmoredOutputStream.builder()
.clearHeaders()
.build(outputStream);
Streams.pipeAll(inputStream, aOut);
aOut.close();
}
};
}
@NotNull
@Override
public Armor label(@NotNull ArmorLabel armorLabel) throws SOPGPException.UnsupportedOption {
throw new SOPGPException.UnsupportedOption("Custom labels not supported.");
}
}

View file

@ -0,0 +1,28 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.bouncycastle.bcpg.ArmoredInputStream;
import org.bouncycastle.util.io.Streams;
import org.jetbrains.annotations.NotNull;
import sop.Ready;
import sop.exception.SOPGPException;
import sop.operation.Dearmor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class BCDearmor implements Dearmor {
@NotNull
@Override
public Ready data(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException {
return new Ready() {
@Override
public void writeTo(@NotNull OutputStream outputStream) throws IOException {
ArmoredInputStream aIn = new ArmoredInputStream(inputStream);
Streams.pipeAll(aIn, outputStream);
aIn.close();
}
};
}
}

View file

@ -0,0 +1,124 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
import org.bouncycastle.openpgp.operator.SessionKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.bc.BcSessionKeyDataDecryptorFactory;
import org.jetbrains.annotations.NotNull;
import sop.DecryptionResult;
import sop.ReadyWithResult;
import sop.SessionKey;
import sop.exception.SOPGPException;
import sop.operation.Decrypt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class BCDecrypt implements Decrypt {
private Date notBefore = new Date(Long.MAX_VALUE); // end of time
private Date notAfter = new Date(); // now
private final List<PGPSessionKey> sessionKeys = new ArrayList<>();
private final List<String> messagePassphrases = new ArrayList<>();
private final List<PGPPublicKeyRing> verificationCerts = new ArrayList<>();
private final List<PGPSecretKeyRing> encryptionKeys = new ArrayList<>();
private final List<String> encryptionKeyPassphrases = new ArrayList<>();
@NotNull
@Override
public ReadyWithResult<DecryptionResult> ciphertext(@NotNull InputStream inputStream) throws SOPGPException.BadData, SOPGPException.MissingArg, SOPGPException.CannotDecrypt, SOPGPException.KeyIsProtected, IOException {
return new ReadyWithResult<DecryptionResult>() {
@Override
public DecryptionResult writeTo(@NotNull OutputStream outputStream) throws IOException, SOPGPException {
InputStream in = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory objFac = new BcPGPObjectFactory(in);
Object next = objFac.nextObject();
if (next instanceof PGPEncryptedDataList) {
PGPEncryptedDataList encDataList = (PGPEncryptedDataList) next;
if (!sessionKeys.isEmpty()) {
PGPSessionKeyEncryptedData sesKeyEnc = encDataList.extractSessionKeyEncryptedData();
SessionKeyDataDecryptorFactory decFac = new BcSessionKeyDataDecryptorFactory(sessionKeys.get(0));
try {
in = sesKeyEnc.getDataStream(decFac);
objFac = new BcPGPObjectFactory(in);
next = objFac.nextObject();
} catch (PGPException e) {
throw new RuntimeException(e);
}
} else {
for (PGPEncryptedData encData : encDataList) {
if (encData instanceof PGPPublicKeyEncryptedData) {
}
}
}
}
return null;
}
};
}
@NotNull
@Override
public Decrypt verifyNotBefore(@NotNull Date date) throws SOPGPException.UnsupportedOption {
this.notBefore = date;
return this;
}
@NotNull
@Override
public Decrypt verifyNotAfter(@NotNull Date date) throws SOPGPException.UnsupportedOption {
this.notAfter = date;
return this;
}
@NotNull
@Override
public Decrypt verifyWithCert(@NotNull InputStream inputStream) throws SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException {
InputStream decodeIn = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory objFac = new BcPGPObjectFactory(decodeIn);
PGPPublicKeyRing cert = (PGPPublicKeyRing) objFac.nextObject();
verificationCerts.add(cert);
return this;
}
@NotNull
@Override
public Decrypt withSessionKey(@NotNull SessionKey sessionKey) throws SOPGPException.UnsupportedOption {
this.sessionKeys.add(new PGPSessionKey(sessionKey.getAlgorithm(), sessionKey.getKey()));
return this;
}
@NotNull
@Override
public Decrypt withPassword(@NotNull String s) throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption {
this.messagePassphrases.add(s);
return this;
}
@NotNull
@Override
public Decrypt withKey(@NotNull InputStream inputStream) throws SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException {
InputStream decodeIn = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory objFac = new BcPGPObjectFactory(decodeIn);
PGPSecretKeyRing key = (PGPSecretKeyRing) objFac.nextObject();
this.encryptionKeys.add(key);
return this;
}
@NotNull
@Override
public Decrypt withKeyPassword(@NotNull byte[] bytes) throws SOPGPException.UnsupportedOption, SOPGPException.PasswordNotHumanReadable {
String passphrase = new String(bytes);
this.encryptionKeyPassphrases.add(passphrase);
return this;
}
}

View file

@ -0,0 +1,59 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
import org.jetbrains.annotations.NotNull;
import sop.Ready;
import sop.exception.SOPGPException;
import sop.operation.ExtractCert;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BCExtractCert implements ExtractCert {
private boolean armor = true;
@NotNull
@Override
public Ready key(@NotNull InputStream inputStream) throws IOException, SOPGPException.BadData {
InputStream decodeIn = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory objFac = new BcPGPObjectFactory(decodeIn);
PGPSecretKeyRing secretKeys = (PGPSecretKeyRing) objFac.nextObject();
List<PGPPublicKey> list = new ArrayList<>();
Iterator<PGPPublicKey> iterator = secretKeys.getPublicKeys();
while (iterator.hasNext()) {
list.add(iterator.next());
}
PGPPublicKeyRing publicKeys = new PGPPublicKeyRing(list);
return new Ready() {
@Override
public void writeTo(@NotNull OutputStream outputStream) throws IOException {
if (armor) {
ArmoredOutputStream aOut = ArmoredOutputStream.builder()
.clearHeaders()
.enableCRC(true)
.build(outputStream);
publicKeys.encode(aOut);
aOut.close();
} else {
publicKeys.encode(outputStream);
}
}
};
}
@NotNull
@Override
public ExtractCert noArmor() {
this.armor = false;
return this;
}
}

View file

@ -0,0 +1,15 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.jetbrains.annotations.NotNull;
import sop.Profile;
import sop.operation.ListProfiles;
import java.util.List;
public class BCListProfiles implements ListProfiles {
@NotNull
@Override
public List<Profile> subcommand(@NotNull String s) {
return List.of();
}
}

View file

@ -0,0 +1,56 @@
package org.pgpainless.bouncycastle.sop.operation;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import sop.exception.SOPGPException;
import sop.operation.Version;
public class BCVersion implements Version {
@NotNull
@Override
public String getBackendVersion() {
return "Bouncy Castle 1.79"; // TODO: Extract from pom
}
@NotNull
@Override
public String getName() {
return "Bouncy Castle SOP";
}
@NotNull
@Override
public String getVersion() {
return "1.0-SNAPSHOT"; // TODO: Extract from pom
}
@NotNull
@Override
public String getExtendedVersion() {
return "";
}
@Override
public int getSopSpecRevisionNumber() {
return 10;
}
@Override
public boolean isSopSpecImplementationIncomplete() {
return false;
}
@Nullable
@Override
public String getSopSpecImplementationRemarks() {
return "";
}
@NotNull
@Override
public String getSopVVersion() throws SOPGPException.UnsupportedOption {
return "1.0";
}
}

47
pom.xml Normal file
View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.pgpainless</groupId>
<artifactId>bc-sop</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>bcsop</module>
<module>bcsop-cli</module>
</modules>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.79</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk18on</artifactId>
<version>1.79</version>
</dependency>
<dependency>
<groupId>org.pgpainless</groupId>
<artifactId>sop-java</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>org.pgpainless</groupId>
<artifactId>sop-java-picocli</artifactId>
<version>10.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

View file

@ -0,0 +1,7 @@
package org.pgpainless;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}