331 lines
19 KiB
Diff
331 lines
19 KiB
Diff
diff -rupN bouncycastle/boca-light/src/main/java/org/bordercastle/crypto/util/DerUtil.java bordercastle/boca-light/src/main/java/org/bordercastle/crypto/util/DerUtil.java
|
|
--- bouncycastle/boca-light/src/main/java/org/bordercastle/crypto/util/DerUtil.java 2025-10-25 07:40:23.182387118 +0200
|
|
+++ bordercastle/boca-light/src/main/java/org/bordercastle/crypto/util/DerUtil.java 2025-10-25 07:40:47.173482490 +0200
|
|
@@ -27,13 +27,8 @@ class DerUtil
|
|
}
|
|
catch (final IOException e)
|
|
{
|
|
- throw new IllegalStateException("Cannot get encoding: " + e.getMessage())
|
|
- {
|
|
- public Throwable getCause()
|
|
- {
|
|
- return e;
|
|
- }
|
|
- };
|
|
+ // TODO: BorderCastle: prevent problems later with android .dex files on obfuscated inner class
|
|
+ throw new IllegalStateException("Cannot get encoding: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
}
|
|
diff -rupN bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHPSParameterSet.java bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHPSParameterSet.java
|
|
--- bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHPSParameterSet.java 2025-10-25 07:40:28.278407368 +0200
|
|
+++ bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHPSParameterSet.java 2025-10-25 07:40:47.174482494 +0200
|
|
@@ -11,7 +11,7 @@ import org.bordercastle.pqc.math.ntru.Po
|
|
* @see NTRUHPS2048509
|
|
* @see NTRUHPS2048677
|
|
* @see NTRUHPS4096821
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification document</a> section 1.3.2
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification document, section 1.3.2</a>
|
|
*/
|
|
public abstract class NTRUHPSParameterSet
|
|
extends NTRUParameterSet
|
|
diff -rupN bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHRSSParameterSet.java bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHRSSParameterSet.java
|
|
--- bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHRSSParameterSet.java 2025-10-25 07:40:28.316407519 +0200
|
|
+++ bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/parameters/NTRUHRSSParameterSet.java 2025-10-25 07:40:47.174482494 +0200
|
|
@@ -10,7 +10,7 @@ import org.bordercastle.pqc.math.ntru.Po
|
|
* The naming convention for the classes is {@code NTRUHRSS[n]}. e.g. {@link NTRUHRSS701} has n = 701.
|
|
*
|
|
* @see NTRUHRSS701
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification document</a> section 1.3.3
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification document, section 1.3.3</a>
|
|
*/
|
|
public abstract class NTRUHRSSParameterSet
|
|
extends NTRUParameterSet
|
|
diff -rupN bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/Polynomial.java bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/Polynomial.java
|
|
--- bouncycastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/Polynomial.java 2025-10-25 07:40:28.335407594 +0200
|
|
+++ bordercastle/boca-light/src/main/java/org/bordercastle/pqc/math/ntru/Polynomial.java 2025-10-25 07:40:47.173482490 +0200
|
|
@@ -80,7 +80,7 @@ public abstract class Polynomial
|
|
*
|
|
* @param len array length of packed polynomial
|
|
* @return
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.5
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.5</a>
|
|
*/
|
|
// defined in packq.c
|
|
public abstract byte[] sqToBytes(int len);
|
|
@@ -90,7 +90,7 @@ public abstract class Polynomial
|
|
* Unpack a Sq polynomial
|
|
*
|
|
* @param a byte array of packed polynomial
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.6
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.6</a>
|
|
*/
|
|
// defined in packq.c
|
|
public abstract void sqFromBytes(byte[] a);
|
|
@@ -101,7 +101,7 @@ public abstract class Polynomial
|
|
*
|
|
* @param len array length of packed polynomial
|
|
* @return
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.3
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.3</a>
|
|
*/
|
|
// defined in packq.c
|
|
public byte[] rqSumZeroToBytes(int len)
|
|
@@ -114,7 +114,7 @@ public abstract class Polynomial
|
|
* Unpack a Rq0 polynomial
|
|
*
|
|
* @param a byte array of packed polynomial
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.4
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.4</a>
|
|
*/
|
|
// defined in packq.c
|
|
public void rqSumZeroFromBytes(byte[] a)
|
|
@@ -135,7 +135,7 @@ public abstract class Polynomial
|
|
*
|
|
* @param messageSize array length of packed polynomial
|
|
* @return
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.7
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.7</a>
|
|
*/
|
|
// defined in pack3.c
|
|
public byte[] s3ToBytes(int messageSize)
|
|
@@ -181,7 +181,7 @@ public abstract class Polynomial
|
|
* Unpack a S3 polynomial
|
|
*
|
|
* @param msg byte array of packed polynomial
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.8.8
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.8.8</a>
|
|
*/
|
|
// defined in pack3.c
|
|
public void s3FromBytes(byte[] msg)
|
|
@@ -248,7 +248,7 @@ public abstract class Polynomial
|
|
|
|
/**
|
|
* @param a
|
|
- * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification</a> section 1.9.3
|
|
+ * @see <a href="https://ntru.org/f/ntru-20190330.pdf">NTRU specification, section 1.9.3</a>
|
|
*/
|
|
// defined in poly_lift.c
|
|
public abstract void lift(Polynomial a);
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/cmp/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/cmp/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/cmp/package-info.java 2025-10-25 07:40:36.887441590 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/cmp/package-info.java 2025-10-25 07:40:47.174482494 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* Basic support package for handling and creating CMP (RFC 4210) certificate management messages.
|
|
*/
|
|
package org.bordercastle.cert.cmp;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/jcajce/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/jcajce/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/jcajce/package-info.java 2025-10-25 07:40:36.373439547 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/jcajce/package-info.java 2025-10-25 07:40:47.174482494 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* JCA extensions to the CRMF online certificate request package.
|
|
*/
|
|
package org.bordercastle.cert.crmf.jcajce;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/package-info.java 2025-10-25 07:40:36.419439730 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/crmf/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* Basic support package for handling and creating CRMF (RFC 4211) certificate request messages.
|
|
*/
|
|
package org.bordercastle.cert.crmf;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/jcajce/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/jcajce/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/jcajce/package-info.java 2025-10-25 07:40:36.573440342 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/jcajce/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* JCA extensions to the certificate building and processing package.
|
|
*/
|
|
package org.bordercastle.cert.jcajce;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/jcajce/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/jcajce/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/jcajce/package-info.java 2025-10-25 07:40:36.749441041 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/jcajce/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* JCA extensions to the OCSP online certificate status package.
|
|
*/
|
|
package org.bordercastle.cert.ocsp.jcajce;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/package-info.java 2025-10-25 07:40:36.764441101 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/ocsp/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* Basic support package for handling and creating OCSP (RFC 2560) online certificate status requests.
|
|
*/
|
|
package org.bordercastle.cert.ocsp;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/selector/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/selector/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/cert/selector/package-info.java 2025-10-25 07:40:36.690440807 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/cert/selector/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* Specialised Selector classes for certificates, CRLs, and attribute certificates.
|
|
*/
|
|
package org.bordercastle.cert.selector;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/bc/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/bc/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/bc/package-info.java 2025-10-25 07:40:33.882429643 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/bc/package-info.java 2025-10-25 07:40:47.175482498 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* BC lightweight API extensions and operators for the PKCS#10 certification request package.
|
|
*/
|
|
package org.bordercastle.pkcs.bc;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/jcajce/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/jcajce/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/jcajce/package-info.java 2025-10-25 07:40:33.790429277 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/jcajce/package-info.java 2025-10-25 07:40:47.176482502 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* JCA extensions and operators for the PKCS#10 certification request package.
|
|
*/
|
|
package org.bordercastle.pkcs.jcajce;
|
|
diff -rupN bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/package-info.java bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/package-info.java
|
|
--- bouncycastle/boca-pkix/src/main/java/org/bordercastle/pkcs/package-info.java 2025-10-25 07:40:33.847429504 +0200
|
|
+++ bordercastle/boca-pkix/src/main/java/org/bordercastle/pkcs/package-info.java 2025-10-25 07:40:47.176482502 +0200
|
|
@@ -1,6 +1,4 @@
|
|
/**
|
|
- * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
- * "https://www.w3.org/TR/html4/loose.dtd">
|
|
* Basic support package for handling and creating PKCS#10 certification requests, PKCS#8 encrypted keys and PKCS#12 keys stores.
|
|
*/
|
|
package org.bordercastle.pkcs;
|
|
diff -rupN bouncycastle/boca-prov/src/main/java/org/bordercastle/jce/provider/BouncyCastleProvider.java bordercastle/boca-prov/src/main/java/org/bordercastle/jce/provider/BouncyCastleProvider.java
|
|
--- bouncycastle/boca-prov/src/main/java/org/bordercastle/jce/provider/BouncyCastleProvider.java 2025-10-25 07:40:40.980457864 +0200
|
|
+++ bordercastle/boca-prov/src/main/java/org/bordercastle/jce/provider/BouncyCastleProvider.java 2025-10-25 07:40:47.176482502 +0200
|
|
@@ -151,7 +151,7 @@ public final class BouncyCastleProvider
|
|
private static final String KEYSTORE_PACKAGE = "org.bordercastle.jcajce.provider.keystore.";
|
|
private static final String[] KEYSTORES =
|
|
{
|
|
- "BoCa", "BCFKS", "PKCS12"
|
|
+ "BC", "BCFKS", "PKCS12"
|
|
};
|
|
|
|
/*
|
|
@@ -172,7 +172,22 @@ public final class BouncyCastleProvider
|
|
*/
|
|
public BouncyCastleProvider()
|
|
{
|
|
- super(PROVIDER_NAME, 1.81, info);
|
|
+ this(PROVIDER_NAME);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Construct a new provider with a custom name. This should only be required when
|
|
+ * using runtime registration of the provider using the
|
|
+ * <code>Security.addProvider()</code> mechanism.
|
|
+ * This constructor allows to give a distinct name to the new provider and thus allows
|
|
+ * to register multiple instances with separate names. This is helpful in environments
|
|
+ * where classloader problems would occur when one classloader installs the provider
|
|
+ * but another classloader attempts to cast objects created by the first provider
|
|
+ * (e.g. in webapp containers where each webapp wants to install the provider).
|
|
+ */
|
|
+ public BouncyCastleProvider(final String providerName)
|
|
+ {
|
|
+ super(providerName, 1.81, info);
|
|
|
|
AccessController.doPrivileged(new PrivilegedAction()
|
|
{
|
|
@@ -184,6 +199,19 @@ public final class BouncyCastleProvider
|
|
});
|
|
}
|
|
|
|
+ @Override public String toString()
|
|
+ {
|
|
+ // the java.security.Provider class in Android doesn't support the
|
|
+ // c'tor with a string version argument
|
|
+ // => was only introduced in JDK-9
|
|
+ // => but Android is based on JDK-8
|
|
+ // => must instead override the base class' toString() method
|
|
+ // to output the version in string form instead of as double
|
|
+ // (which would truncate trailing zeroes)
|
|
+ // => output "1.80" instead of "1.8" ...
|
|
+ return getName() + " version " + org.bordercastle.Version.getVersion();
|
|
+ }
|
|
+
|
|
private void setup()
|
|
{
|
|
loadAlgorithms(DIGEST_PACKAGE, DIGESTS);
|
|
diff -rupN bouncycastle/boca-prov/src/main/java/org/bordercastle/pqc/jcajce/provider/BouncyCastlePQCProvider.java bordercastle/boca-prov/src/main/java/org/bordercastle/pqc/jcajce/provider/BouncyCastlePQCProvider.java
|
|
--- bouncycastle/boca-prov/src/main/java/org/bordercastle/pqc/jcajce/provider/BouncyCastlePQCProvider.java 2025-10-25 07:40:40.159454599 +0200
|
|
+++ bordercastle/boca-prov/src/main/java/org/bordercastle/pqc/jcajce/provider/BouncyCastlePQCProvider.java 2025-10-25 07:40:47.176482502 +0200
|
|
@@ -51,7 +51,22 @@ public class BouncyCastlePQCProvider
|
|
*/
|
|
public BouncyCastlePQCProvider()
|
|
{
|
|
- super(PROVIDER_NAME, 1.81, info);
|
|
+ this(PROVIDER_NAME);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Construct a new provider with a custom name. This should only be required when
|
|
+ * using runtime registration of the provider using the
|
|
+ * <code>Security.addProvider()</code> mechanism.
|
|
+ * This constructor allows to give a distinct name to the new provider and thus allows
|
|
+ * to register multiple instances with separate names. This is helpful in environments
|
|
+ * where classloader problems would occur when one classloader installs the provider
|
|
+ * but another classloader attempts to cast objects created by the first provider
|
|
+ * (e.g. in webapp containers where each webapp wants to install the provider).
|
|
+ */
|
|
+ public BouncyCastlePQCProvider(final String providerName)
|
|
+ {
|
|
+ super(providerName, 1.81, info);
|
|
|
|
AccessController.doPrivileged(new PrivilegedAction()
|
|
{
|
|
@@ -63,6 +78,19 @@ public class BouncyCastlePQCProvider
|
|
});
|
|
}
|
|
|
|
+ @Override public String toString()
|
|
+ {
|
|
+ // the java.security.Provider class in Android doesn't support the
|
|
+ // c'tor with a string version argument
|
|
+ // => was only introduced in JDK-9
|
|
+ // => but Android is based on JDK-8
|
|
+ // => must instead override the base class' toString() method
|
|
+ // to output the version in string form instead of as double
|
|
+ // (which would truncate trailing zeroes)
|
|
+ // => output "1.80" instead of "1.8" ...
|
|
+ return getName() + " version " + org.bordercastle.Version.getVersion();
|
|
+ }
|
|
+
|
|
private void setup()
|
|
{
|
|
loadAlgorithms(ALGORITHM_PACKAGE, ALGORITHMS);
|
|
diff -rupN bouncycastle/boca-util/src/main/java/org/bordercastle/asn1/tsp/ArchiveTimeStamp.java bordercastle/boca-util/src/main/java/org/bordercastle/asn1/tsp/ArchiveTimeStamp.java
|
|
--- bouncycastle/boca-util/src/main/java/org/bordercastle/asn1/tsp/ArchiveTimeStamp.java 2025-10-25 07:40:44.480471784 +0200
|
|
+++ bordercastle/boca-util/src/main/java/org/bordercastle/asn1/tsp/ArchiveTimeStamp.java 2025-10-25 07:40:47.177482506 +0200
|
|
@@ -17,7 +17,6 @@ import org.bordercastle.asn1.x509.Algori
|
|
|
|
/**
|
|
* Implementation of the Archive Timestamp type defined in RFC4998.
|
|
- * @see <a href="https://tools.ietf.org/html/rfc4998">RFC 4998</a>
|
|
* <p>
|
|
* ASN.1 Archive Timestamp
|
|
* <p>
|
|
@@ -30,6 +29,7 @@ import org.bordercastle.asn1.x509.Algori
|
|
* PartialHashtree ::= SEQUENCE OF OCTET STRING
|
|
* <p>
|
|
* Attributes ::= SET SIZE (1..MAX) OF Attribute
|
|
+ * @see <a href="https://tools.ietf.org/html/rfc4998">RFC 4998</a>
|
|
*/
|
|
public class ArchiveTimeStamp
|
|
extends ASN1Object
|