ECC Class
Properties Methods Events Config Settings Errors
The ECC (Elliptic Curve Cryptography) class implements ECDSA, EdDSA, ECDH, and ECIES operations.
Class Name
IPWorksEncrypt_ECC
Procedural Interface
ipworksencrypt_ecc_open(); ipworksencrypt_ecc_close($res); ipworksencrypt_ecc_register_callback($res, $id, $function); ipworksencrypt_ecc_get_last_error($res); ipworksencrypt_ecc_get_last_error_code($res); ipworksencrypt_ecc_set($res, $id, $index, $value); ipworksencrypt_ecc_get($res, $id, $index); ipworksencrypt_ecc_do_computesecret($res); ipworksencrypt_ecc_do_config($res, $configurationstring); ipworksencrypt_ecc_do_createkey($res, $keyalgorithm); ipworksencrypt_ecc_do_decrypt($res); ipworksencrypt_ecc_do_encrypt($res); ipworksencrypt_ecc_do_reset($res); ipworksencrypt_ecc_do_sign($res); ipworksencrypt_ecc_do_verifysignature($res);
Remarks
The ECC (Elliptic Curve Cryptography) class implements ECDSA (Elliptic Curve Digital Signature Algorithm), EdDSA (Edwards-curve Digital Signature Algorithm), and ECDH (Elliptic Curve Diffie Hellman), and ECIES (Elliptic Curve Integrated Encryption Scheme) operations. The class supports the following common operations:
- CreateKey allows key creation using algorithms such as secp256r1, secp384r1, secp521r1, X25519, X448, Ed25519, Ed448, and more.
- ComputeSecret computes a shared secret between two parties using a public and private key (ECDH).
- Sign and VerifySignature provides a way to digitally sign data and verify signatures (ECDSA and EdDSA).
- Encrypt and Decrypt encrypt and decrypt data using a public and private key (ECIES).
The class is very flexible and offers many properties and configuration settings to configure the class. The sections below detail the use of the class for each of the major operations listed above.
Key Creation and Management
CreateKey creates a new public and private key.
When this method is called Key is populated with the generated key. The KeyPublicKey and KeyPrivateKey property hold the PEM formatted public and private key for ease of use. This is helpful for storing or transporting keys more easily.
The KeyAlgorithm parameter specifies the algorithm for which the key is intended to be used. Possible values are:
NIST, Koblitz, and Brainpool Curve Notes
Keys for use with NIST curves (secp256r1, secp384r1, secp521r1), Koblitz curves (secp160k1, secp192k1, secp224k1, secp256k1), and Brainpool curves are made up of a number of individual parameters.
The public key consists of the following parameters:
The private key consists of one value:
Curve25519 and Curve448 Notes
Keys for use with Curve25519 or Curve448 are made up of a private key and public key field.
KeyXPk holds the public key.
KeyXSk holds the private key.
Create Key Example (secp256r1 - PEM)
//Create a key using secp256r1
Ecc ecc = new Ecc();
ecc.CreateKey("secp256r1");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
string privKey = ecc.Key.PrivateKey; //PEM formatted key
string pubKey = ecc.Key.PublicKey; //PEM formatted key
//Load the saved key
ecc.Reset();
ecc.Key.PublicKey = pubKey;
ecc.Key.PrivateKey = privKey;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
Create Key Example (secp256r1 - Raw Key Params)
//Create a key using secp256r1 and store/load the key using the individual params
Ecc ecc = new Ecc();
ecc.CreateKey("secp256r1");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
byte[] K = ecc.Key.KB; //Private key param
byte[] Rx = ecc.Key.RxB; //Public key param
byte[] Ry = ecc.Key.RyB; //Public key param
//Load the saved key
ecc.Reset();
ecc.Key.Algorithm = ECAlgorithms.eaSecp256r1; //This MUST be set manually when using key params directly
ecc.Key.KB = K;
ecc.Key.RxB = Rx;
ecc.Key.RyB = Ry;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
Create Key Example (Ed25519 - PEM)
//Create a key using Ed25519
Ecc ecc = new Ecc();
ecc.CreateKey("Ed25519");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
string privKey = ecc.Key.PrivateKey; //PEM formatted key
string pubKey = ecc.Key.PublicKey; //PEM formatted key
//Load the saved key
ecc.Reset();
ecc.Key.PublicKey = pubKey;
ecc.Key.PrivateKey = privKey;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
Create Key Example (Ed25519 - Raw Key Params)
//Create a key using Ed25519 and store/load the key using the individual params
Ecc ecc = new Ecc();
ecc.CreateKey("Ed25519");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
byte[] XPk = ecc.Key.XPkB; //Public key data
byte[] XSk = ecc.Key.XSkB; //Secret key data
//Load the saved key
ecc.Reset();
ecc.Key.Algorithm = ECAlgorithms.eaEd25519; //This MUST be set manually when using key params directly
ecc.Key.XPkB = XPk;
ecc.Key.XSkB = XSk;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
Compute Secret (ECDH)
This method computes a shared secret using Elliptic Curve Diffie Hellman (ECDH).
When this method is called the class will use the public key specified by RecipientKeyPublicKey and the private key specified by Key to compute a shared secret, or secret agreement. The ComputeSecretKDF property specifies the Hash or HMAC algorithm that is applied to the raw secret. The resulting value is held by SharedSecret. The following properties are applicable when calling this method:
- Key (required)
- RecipientKeyPublicKey (required)
- ComputeSecretKDF (optional)
See ComputeSecretKDF for details on advanced settings that may be applicable for the chosen algorithm.
Keys created with the Ed25519 and Ed448 algorithms are not supported when calling this method.
Compute Secret Example
//Create a key for Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("X25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Create a key for Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("X25519");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Note: the public keys must be exchanged between parties by some mechanism
//Create the shared secret on Party 1
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv; //Private key of this party
ecc1.RecipientKey.PublicKey = ecc2_pub; //Public key of other party
ecc1.UseHex = true; //Hex encodes the shared secret bytes for easier display/storage
ecc1.ComputeSecret();
Console.WriteLine(ecc1.SharedSecret);
//Create the shared secret on Party 2
ecc2.Reset();
ecc2.Key.PrivateKey = ecc2_priv; //Private key of this party
ecc2.RecipientKey.PublicKey = ecc1_pub; //Public key of other party
ecc2.UseHex = true; //Hex encodes the shared secret bytes for easier display/storage
ecc2.ComputeSecret();
Console.WriteLine(ecc2.SharedSecret); //This will match the shared secret created by ecc1.
Signing (ECDSA and EdDSA)
Sign will create a hash signature using ECDSA or EdDSA. The class will use the key specified by Key to has the input data and sign the resulting hash.
Key must contain a private key created with a valid ECDSA or EdDSA algorithm. KeyAlgorithm is used to determine the eligibility of the key for this operation. Supported algorithms for signing are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
- Ed25519 and Ed448
See CreateKey for details about key creation and algorithms.
When this method is called data will be read from the InputFile or InputMessage.
The hash to be signed will be computed using the specified HashAlgorithm. The computed hash is stored in the HashValue property. The signed hash is stored in the HashSignature property.
To sign as hash without first computing it set HashValue to a previously computed hash for the input data. Note: HashValue is not applicable when signing with a PureEdDSA algorithm such as "Ed25519" or "Ed448".
The Progress event will fire with updates for the hash computation progress only. The hash signature creation process is quick and does not require progress updates.
After calling Sign the public key must be sent to the recipient along with HashSignature and original input data so the other party may perform signature verification.
The following properties are applicable when calling this method:
- Key (required)
- HashAlgorithm (applicable to ECDSA only)
- HashEdDSA (applicable to EdDSA only)
- HashValue (not applicable to PureEdDSA)
- UseHex
The following properties are populated after calling this method:
EdDSA Notes
When the KeyAlgorithm is Ed25519 or Ed448 the following additional parameters are applicable:
EdDSA keys can be used with a PureEdDSA algorithm (Ed25519/Ed448) or as HashEdDSA (Ed25519ph, Ed448ph) algorithm. This is controlled by the HashEdDSA property. By default the class uses the PureEdDSA algorithm.
The PureEdDSA algorithm requires two passes over the input data but provides collision resilience. The collision resilience of PureEdDSA means even if it is feasible to compute collisions for the hash function, the algorithm is still secure. When using PureEdDSA HashValue is not applicable.
When using a HashEdDSA algorithm the input is pre-hashed and supports a single pass over the data during the signing operation. To enable HashEdDSA set HashEdDSA to True.
To specify context data when using Ed25519 or Ed448 set EdDSAContext.
Sign And Verify Example (ECDSA)
//Create an ECDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("secp256r1");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - PureEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - HashEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.HashEdDSA = true; //Use "ed25519ph"
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.HashEdDSA = true;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Verifying (ECDSA and EdDSA)
VerifySignature will verify a hash signature and return True if successful or False otherwise.
Before calling this method specify the input file by setting InputFile or InputMessage.
A public key and the hash signature are required to perform the signature verification. Specify the public key in SignerKey. Specify the hash signature in HashSignature.
When this method is called the class will compute the hash for the specified file and populate HashValue. It will verify the signature using the specified SignerKey and HashSignature.
To verify the hash signature without first computing the hash simply specify HashValue before calling this method. Note: HashValue is not applicable when the message was signed with a PureEdDSA algorithm such as Ed25519 or Ed448.
The Progress event will fire with updates for the hash computation progress only. The hash signature verification process is quick and does not require progress updates.
The following properties are applicable when calling this method:
- HashSignature (required)
- SignerKey (required)
- EdDSAContext (applicable to EdDSA only)
- HashAlgorithm (applicable to ECDSA only)
- HashEdDSA (applicable to EdDSA only)
- HashValue (not applicable to PureEdDSA)
- UseHex
Sign And Verify Example (ECDSA)
//Create an ECDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("secp256r1");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - PureEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - HashEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.HashEdDSA = true; //Use "ed25519ph"
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.HashEdDSA = true;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Encrypting (ECIES)
Encrypt encrypts the specified data with the ECDSA public key specified in RecipientKey.
Encryption is performed using ECIES which requires an ECDSA key. RecipientKey must contain an ECDSA key. Algorithm is used to determine the eligibility of the key for this operation. Supported algorithms for encryption are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
See CreateKey for details about key creation and algorithms.
When this method is called the class will encrypt the specified data using ECIES and the encrypted data will be output. To hex encode the output set UseHex to True.
The following properties are applicable when calling this method:
- EncryptionAlgorithm
- HMACAlgorithm
- HMACOptionalInfo
- HMACKeySize
- IV
- KDF
- KDFHashAlgorithm
- KDFOptionalInfo
- UseHex
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Encrypt and Decrypt Example
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (AES with IV)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
//Use an IV (16 bytes for AES) - In a real environment this should be random
byte[] IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc1.IVB = IV;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message and the IV to Party 2
//Decrypt the message using the private key for Party 2 and the IV
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc2.IVB = IV;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (XOR Encryption Algorithm)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (KDF Options)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.KDF = "KDF1"; //Use KDF1
ecc1.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc1.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f"); //Hex encoded string
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.KDF = "KDF1";
ecc2.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc2.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f");
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Decrypting (ECIES)
Decrypt decrypts the specified data with the ECDSA private key specified in Key.
Decryption is performed using ECIES which requires an ECDSA key. Key must contain an ECDSA key. KeyAlgorithm is used to determine the eligibility of the key for this operation. Supported algorithms for encryption are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
See CreateKey for details about key creation and algorithms.
When this method is called the class will decrypt the specified data using ECIES and the decrypted data will be output. If the input data was originally hex encoded, set UseHex to True.
The following properties are applicable when calling this method:
- EncryptionAlgorithm
- HMACAlgorithm
- HMACOptionalInfo
- HMACKeySize
- IV
- KDF
- KDFHashAlgorithm
- KDFOptionalInfo
- UseHex
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Encrypt and Decrypt Example
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (AES with IV)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
//Use an IV (16 bytes for AES) - In a real environment this should be random
byte[] IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc1.IVB = IV;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message and the IV to Party 2
//Decrypt the message using the private key for Party 2 and the IV
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc2.IVB = IV;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (XOR Encryption Algorithm)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (KDF Options)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.KDF = "KDF1"; //Use KDF1
ecc1.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc1.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f"); //Hex encoded string
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.KDF = "KDF1";
ecc2.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc2.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f");
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Property List
The following is the full list of the properties of the class with short descriptions. Click on the links for further details.
ComputeSecretKDF | The key derivation function. |
EncryptionAlgorithm | The encryption algorithm to use. |
HashAlgorithm | The hash algorithm used for hash computation. |
HashEdDSA | Whether to use HashEdDSA when signing with an Ed25519 or Ed448 key. |
HashSignature | The hash signature. |
HashValue | The hash value of the data. |
HMACAlgorithm | The HMAC algorithm to use during encryption. |
InputFile | The file to process. |
InputMessage | The message to process. |
IV | The initialization vector (IV) used when encrypting. |
KDF | The key derivation function used during encryption and decryption. |
KDFHashAlgorithm | The KDF hash algorithm to use when encrypting and decrypting. |
KeyAlgorithm | This property holds the algorithm associated with the key. |
KeyK | Represent the private key (K) parameter. |
KeyPrivateKey | This property is a PEM formatted private key. |
KeyPublicKey | This property is a PEM formatted public key. |
KeyRx | Represents the public key's Rx parameter. |
KeyRy | Represents the public key's Ry parameter. |
KeyXPk | Holds the public key data. |
KeyXSk | Holds the private key data. |
OutputFile | The output file when encrypting or decrypting. |
OutputMessage | The output message when encrypting or decrypting. |
Overwrite | Indicates whether or not the class should overwrite files. |
RecipientKeyAlgorithm | This property holds the algorithm associated with the key. |
RecipientKeyPublicKey | This property is a PEM formatted public key. |
RecipientKeyRx | Represents the public key's Rx parameter. |
RecipientKeyRy | Represents the public key's Ry parameter. |
RecipientKeyXPk | Holds the public key data. |
SharedSecret | The computed shared secret. |
SignerKeyAlgorithm | This property holds the algorithm associated with the key. |
SignerKeyPublicKey | This property is a PEM formatted public key. |
SignerKeyRx | Represents the public key's Rx parameter. |
SignerKeyRy | Represents the public key's Ry parameter. |
SignerKeyXPk | Holds the public key data. |
UseHex | Whether binary values are hex encoded. |
Method List
The following is the full list of the methods of the class with short descriptions. Click on the links for further details.
ComputeSecret | Computes a shared secret. |
Config | Sets or retrieves a configuration setting. |
CreateKey | Creates a new key. |
Decrypt | Decrypted the specified data. |
Encrypt | Encrypts the specified data. |
Reset | Resets the class. |
Sign | Creates a hash signature using ECDSA or EdDSA. |
VerifySignature | Verifies the signature for the specified data. |
Event List
The following is the full list of the events fired by the class with short descriptions. Click on the links for further details.
Error | Information about errors during data delivery. |
Progress | Fired as progress is made. |
Config Settings
The following is a list of config settings for the class with short descriptions. Click on the links for further details.
AppendSecret | An optional string to append to the secret agreement. |
CNGECDHKey | The CNG ECDH key. |
CNGECDSAKey | The CNG ECDSA key. |
ConcatAlgorithmId | Specifies the AlgorithmId subfield of the OtherInfo field. |
ConcatHashAlgorithm | The hash algorithm to use when ComputeSecretKDF is Concat. |
ConcatPartyUInfo | Specifies the PartyUInfo subfield of the OtherInfo field. |
ConcatPartyVInfo | Specifies the PartyVInfo subfield of the OtherInfo field. |
ConcatSuppPrivInfo | Specifies the SuppPrivInfo subfield of the OtherInfo field. |
ConcatSuppPubInfo | Specifies the SuppPubInfo subfield of the OtherInfo field. |
ECDSASignatureFormat | The format of the HashSignature when using ECDSA keys. |
EdDSAContext | A hex encoded string holding the bytes of the context when signing or verifying with Ed25519ctx. |
EncryptionKeySize | The encryption key size. |
HMACKey | A key to use when generating a Hash-based Message Authentication Code (HMAC). |
HMACKeySize | Specifies the HMAC key size to be used during encryption. |
HMACOptionalInfo | Optional data to be used during encryption and decryption during the HMAC step. |
KDFOptionalInfo | Optional data to be used during encryption and decryption during the key derivation step. |
PrependSecret | An optional string to prepend to the secret agreement. |
StrictKeyValidation | Whether to validate provided public keys based on private keys. |
TLSLabel | The TLS PRF label. |
TLSSeed | The TLS PRF Seed. |
BuildInfo | Information about the product's build. |
CodePage | The system code page used for Unicode to Multibyte translations. |
LicenseInfo | Information about the current license. |
MaskSensitive | Whether sensitive data is masked in log messages. |
ProcessIdleEvents | Whether the class uses its internal event loop to process events when the main thread is idle. |
SelectWaitMillis | The length of time in milliseconds the class will wait when DoEvents is called if there are no events to process. |
UseInternalSecurityAPI | Tells the class whether or not to use the system security libraries or an internal implementation. |
ComputeSecretKDF Property (IPWorksEncrypt_ECC Class)
The key derivation function.
Object Oriented Interface
public function getComputeSecretKDF(); public function setComputeSecretKDF($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 1 ); ipworksencrypt_ecc_set($res, 1, $value );
Default Value
1
Remarks
This property specifies the key derivation function (KDF) and algorithm to use when calling ComputeSecret.
Possible values are:
0 (ekdSHA1) | SHA-1 |
1 (ekdSHA256 - default) | SHA-256 |
2 (ekdSHA384) | SHA-384 |
3 (ekdSHA512) | SHA-512 |
4 (ekdMD2) | MD2 |
5 (ekdMD4) | MD4 |
6 (ekdMD5) | MD5 |
7 (ekdHMACSHA1) | HMAC-SHA1 |
8 (ekdHMACSHA256) | HMAC-SHA256 |
9 (ekdHMACSHA384) | HMAC-SHA384 |
10 (ekdHMACSHA512) | HMAC-SHA512 |
11 (ekdHMACMD5) | HMAC-MD5 |
12 (ekdTLS) | TLS |
13 (ekdConcat) | Concat |
HMAC Notes
If an HMAC algorithm is selected HMACKey may optionally be set to specify the key.
TLS Notes
When set to TLS, TLSSeed and TLSLabel are required. In addition PrependSecret and AppendSecret are not applicable.
Concat Notes
If Concat is selected the following configuration settings are applicable:
- ConcatAlgorithmId (required)
- ConcatPartyUInfo (required)
- ConcatPartyVInfo (required)
- ConcatSuppPubInfo
- ConcatSuppPrivInfo
- ConcatHashAlgorithm
Data Type
Integer
EncryptionAlgorithm Property (IPWorksEncrypt_ECC Class)
The encryption algorithm to use.
Object Oriented Interface
public function getEncryptionAlgorithm(); public function setEncryptionAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 2 ); ipworksencrypt_ecc_set($res, 2, $value );
Default Value
0
Remarks
This setting specifies the encryption algorithm to use when Encrypt is called. This must also be set before calling Decrypt to match the algorithm used during the initial encryption.
Possible values are:
- 0 (iesAES - default)
- 1 (iesTripleDES)
- 2 (iesXOR)
AES Notes
When EncryptionAlgorithm is set to iesAES AES CBC with a default key size of 256 bits is used. To specify a different key size set EncryptionKeySize.Data Type
Integer
HashAlgorithm Property (IPWorksEncrypt_ECC Class)
The hash algorithm used for hash computation.
Object Oriented Interface
public function getHashAlgorithm(); public function setHashAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 3 ); ipworksencrypt_ecc_set($res, 3, $value );
Default Value
2
Remarks
This property specifies the hash algorithm used for hash computation. This is only applicable when calling Sign or VerifySignature and KeyAlgorithm specifies a ECDSA key (NIST, Koblitz, or Brainpool curve). Possible values are:
0 (ehaSHA1) | SHA-1 |
1 (ehaSHA224) | SHA-224 |
2 (ehaSHA256 - default) | SHA-256 |
3 (ehaSHA384) | SHA-384 |
4 (ehaSHA512) | SHA-512 |
5 (ehaMD2) | MD2 |
6 (ehaMD4) | MD4 |
7 (ehaMD5) | MD5 |
8 (ehaMD5SHA1) | MD5SHA-1 |
9 (ehaRIPEMD160) | RIPEMD-160 |
When KeyAlgorithm specified an EdDSA key this setting is not applicable, as the hash algorithm is defined by the specification as SHA-512 for Ed25519 and SHAKE-256 for Ed448.
Data Type
Integer
HashEdDSA Property (IPWorksEncrypt_ECC Class)
Whether to use HashEdDSA when signing with an Ed25519 or Ed448 key.
Object Oriented Interface
public function getHashEdDSA(); public function setHashEdDSA($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 4 ); ipworksencrypt_ecc_set($res, 4, $value );
Default Value
false
Remarks
This setting specifies whether to use the HashEdDSA algorithm when signing and verifying with Ed25519 or Ed448 keys.
If set to True the class will use the HashEdDSA algorithm (Ed25519ph or Ed448ph) when signing and verifying. When using a HashEdDSA algorithm the input is pre-hashed and supports a single pass over the data during the signing operation.
If set to False (Default) the class will use the PureEdDSA algorithm (Ed25519 or Ed448) when signing. The PureEdDSA requires two passes over the input data but provides collision resilience. The collision resilience of PureEdDSA means even if it is feasible to compute collisions for the hash function, the algorithm is still secure.
This property is only applicable when calling Sign and KeyAlgorithm is set to Ed25519 or Ed448.
If this property is set before calling Sign it must be set before calling VerifySignature.
Data Type
Boolean
HashSignature Property (IPWorksEncrypt_ECC Class)
The hash signature.
Object Oriented Interface
public function getHashSignature(); public function setHashSignature($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 5 ); ipworksencrypt_ecc_set($res, 5, $value );
Default Value
''
Remarks
This property holds the computed hash signature. This is populated after calling Sign. This must be set before calling VerifySignature.
Data Type
Binary String
HashValue Property (IPWorksEncrypt_ECC Class)
The hash value of the data.
Object Oriented Interface
public function getHashValue(); public function setHashValue($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 6 ); ipworksencrypt_ecc_set($res, 6, $value );
Default Value
''
Remarks
This property holds the computed hash value for the specified data. This is populated when calling Sign or VerifySignature when an input file is specified by setting InputFile or InputMessage.
Pre-existing hash values may be set to this property before calling Sign or VerifySignature. If you know the hash value prior to using the class you may specify the pre-computed hash value here.
This setting is not applicable to PureEdDSA algorithms. If KeyAlgorithm is Ed25519 or Ed448 and HashEdDSA is False (default), the PureEdDSA algorithm is use and HashValue is not applicable.
Hash Notes
The class will determine whether or not to recompute the hash based on the properties that are set. If a file is specified by InputFile or InputMessage the hash will be recomputed when calling Sign or VerifySignature. If the HashValue property is set the class will only sign the hash or verify the hash signature. Setting InputFile or InputMessage clears the HashValue property. Setting the HashValue property clears the input file selection.
Data Type
Binary String
HMACAlgorithm Property (IPWorksEncrypt_ECC Class)
The HMAC algorithm to use during encryption.
Object Oriented Interface
public function getHMACAlgorithm(); public function setHMACAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 7 ); ipworksencrypt_ecc_set($res, 7, $value );
Default Value
2
Remarks
This property specifies the HMAC algorithm to use when encrypting. The HMAC algorithm is used when Encrypt and Decrypt are called to protect and verify data. Possible values are:
- 0 (iesHMACSHA1)
- 1 (iesHMACSHA224)
- 2 (iesHMACSHA256 - Default)
- 3 (iesHMACSHA384)
- 4 (iesHMACSHA512)
- 5 (iesHMACRIPEMD160)
This property is only applicable when calling Encrypt or Decrypt.
Data Type
Integer
InputFile Property (IPWorksEncrypt_ECC Class)
The file to process.
Object Oriented Interface
public function getInputFile(); public function setInputFile($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 8 ); ipworksencrypt_ecc_set($res, 8, $value );
Default Value
''
Remarks
This property specifies the file to be processed. Set this property to the full or relative path to the file which will be processed.
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
- InputFile
- InputMessage
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Data Type
String
InputMessage Property (IPWorksEncrypt_ECC Class)
The message to process.
Object Oriented Interface
public function getInputMessage(); public function setInputMessage($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 9 ); ipworksencrypt_ecc_set($res, 9, $value );
Default Value
''
Remarks
This property specifies the message to be processed.
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
- InputFile
- InputMessage
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Data Type
Binary String
IV Property (IPWorksEncrypt_ECC Class)
The initialization vector (IV) used when encrypting.
Object Oriented Interface
public function getIV(); public function setIV($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 10 ); ipworksencrypt_ecc_set($res, 10, $value );
Default Value
''
Remarks
This property optionally specifies an IV to be used when calling Encrypt or Decrypt. If specified the IV is used by EncryptionAlgorithm during encryption.
If not specified the class will create an IV filled with null bytes (zeros). Since the encryption key is only used once the use of null bytes in the IV is considered acceptable and is a standard practice.
The length of the IV should be as follows:
EncryptionAlgorithm | IV Length (in bytes) |
AES | 16 |
3DES | 8 |
This setting is not applicable when EncryptionAlgorithm is set to XOR.
Data Type
Binary String
KDF Property (IPWorksEncrypt_ECC Class)
The key derivation function used during encryption and decryption.
Object Oriented Interface
public function getKDF(); public function setKDF($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 11 ); ipworksencrypt_ecc_set($res, 11, $value );
Default Value
'KDF2'
Remarks
This property specifies the key derivation function (KDF) to use when encrypting and decrypting. Possible values are:
- "KDF1"
- "KDF2" (Default)
This property is only applicable when calling Encrypt or Decrypt.
Data Type
String
KDFHashAlgorithm Property (IPWorksEncrypt_ECC Class)
The KDF hash algorithm to use when encrypting and decrypting.
Object Oriented Interface
public function getKDFHashAlgorithm(); public function setKDFHashAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 12 ); ipworksencrypt_ecc_set($res, 12, $value );
Default Value
2
Remarks
This property specifies the hash algorithm to use in when deriving a key using the specified KDF. Possible values are:
- 0 (iesSHA1)
- 1 (iesSHA224)
- 2 (iesSHA256)
- 3 (iesSHA384)
- 4 (iesSHA512)
This property is only applicable when calling Encrypt or Decrypt.
Data Type
Integer
KeyAlgorithm Property (IPWorksEncrypt_ECC Class)
This property holds the algorithm associated with the key.
Object Oriented Interface
public function getKeyAlgorithm(); public function setKeyAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 13 ); ipworksencrypt_ecc_set($res, 13, $value );
Default Value
0
Remarks
This property holds the algorithm associated with the key. Possible values are:
- 0 (eaSecp256r1)
- 1 (eaSecp384r1)
- 2 (eaSecp521r1)
- 3 (eaEd25519)
- 4 (eaEd448)
- 5 (eaX25519)
- 6 (eaX448)
- 7 (eaSecp160k1)
- 8 (eaSecp192k1)
- 9 (eaSecp224k1)
- 10 (eaSecp256k1)
- 11 (eaBrainpoolP160r1)
- 12 (eaBrainpoolP192r1)
- 13 (eaBrainpoolP224r1)
- 14 (eaBrainpoolP256r1)
- 15 (eaBrainpoolP320r1)
- 16 (eaBrainpoolP384r1)
- 17 (eaBrainpoolP512r1)
- 18 (eaBrainpoolP160t1)
- 19 (eaBrainpoolP192t1)
- 20 (eaBrainpoolP224t1)
- 21 (eaBrainpoolP256t1)
- 22 (eaBrainpoolP320t1)
- 23 (eaBrainpoolP384t1)
- 24 (eaBrainpoolP512t1)
When assigning a key using the PEM formatted KeyPrivateKey and KeyPublicKey the KeyAlgorithm property will be automatically updated with the key algorithm.
When assigning a key using the raw key parameters (KeyK, KeyRx, and KeyRy for NIST or KeyXPk, and KeyXSk for Curve25519/Curve448) the KeyAlgorithm property must be set manually to the key algorithm.
The following table summarizes the supported operations for keys created with each algorithm:
KeyAlgorithm | Supported Operations |
secp256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp521r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
X25519 | ECDH (ComputeSecret) |
X448 | ECDH (ComputeSecret) |
Ed25519 | EdDSA (Sign and VerifySignature) |
Ed448 | EdDSA (Sign and VerifySignature) |
secp160k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp192k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp224k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp256k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
Data Type
Integer
KeyK Property (IPWorksEncrypt_ECC Class)
Represent the private key (K) parameter.
Object Oriented Interface
public function getKeyK(); public function setKeyK($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 14 ); ipworksencrypt_ecc_set($res, 14, $value );
Default Value
''
Remarks
Represent the private key (K) parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
KeyPrivateKey Property (IPWorksEncrypt_ECC Class)
This property is a PEM formatted private key.
Object Oriented Interface
public function getKeyPrivateKey(); public function setKeyPrivateKey($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 15 ); ipworksencrypt_ecc_set($res, 15, $value );
Default Value
''
Remarks
This property is a PEM formatted private key. The purpose of this property is to allow easier management of the private key parameters by using only a single value.
Data Type
String
KeyPublicKey Property (IPWorksEncrypt_ECC Class)
This property is a PEM formatted public key.
Object Oriented Interface
public function getKeyPublicKey(); public function setKeyPublicKey($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 16 ); ipworksencrypt_ecc_set($res, 16, $value );
Default Value
''
Remarks
This property is a PEM formatted public key. The purpose of this property is to allow easier management of the public key parameters by using only a single value.
Data Type
String
KeyRx Property (IPWorksEncrypt_ECC Class)
Represents the public key's Rx parameter.
Object Oriented Interface
public function getKeyRx(); public function setKeyRx($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 17 ); ipworksencrypt_ecc_set($res, 17, $value );
Default Value
''
Remarks
Represents the public key's Rx parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
KeyRy Property (IPWorksEncrypt_ECC Class)
Represents the public key's Ry parameter.
Object Oriented Interface
public function getKeyRy(); public function setKeyRy($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 18 ); ipworksencrypt_ecc_set($res, 18, $value );
Default Value
''
Remarks
Represents the public key's Ry parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
KeyXPk Property (IPWorksEncrypt_ECC Class)
Holds the public key data.
Object Oriented Interface
public function getKeyXPk(); public function setKeyXPk($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 19 ); ipworksencrypt_ecc_set($res, 19, $value );
Default Value
''
Remarks
Holds the public key data.
Note: This value is only applicable when using Curve25519 or Curve448.
Data Type
Binary String
KeyXSk Property (IPWorksEncrypt_ECC Class)
Holds the private key data.
Object Oriented Interface
public function getKeyXSk(); public function setKeyXSk($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 20 ); ipworksencrypt_ecc_set($res, 20, $value );
Default Value
''
Remarks
Holds the private key data.
Note: This value is only applicable when using Curve25519 or Curve448.
Data Type
Binary String
OutputFile Property (IPWorksEncrypt_ECC Class)
The output file when encrypting or decrypting.
Object Oriented Interface
public function getOutputFile(); public function setOutputFile($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 21 ); ipworksencrypt_ecc_set($res, 21, $value );
Default Value
''
Remarks
This property specifies the file to which the output will be written when Encrypt or Decrypt is called. This may be set to an absolute or relative path.
This property is only applicable to Encrypt and Decrypt.
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Data Type
String
OutputMessage Property (IPWorksEncrypt_ECC Class)
The output message when encrypting or decrypting.
Object Oriented Interface
public function getOutputMessage();
Procedural Interface
ipworksencrypt_ecc_get($res, 22 );
Default Value
''
Remarks
This property will be populated with the output after calling Encrypt or Decrypt if OutputFile is not set.
This property is only applicable to Encrypt and Decrypt.
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
This property is read-only and not available at design time.
Data Type
Binary String
Overwrite Property (IPWorksEncrypt_ECC Class)
Indicates whether or not the class should overwrite files.
Object Oriented Interface
public function getOverwrite(); public function setOverwrite($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 23 ); ipworksencrypt_ecc_set($res, 23, $value );
Default Value
false
Remarks
This property indicates whether or not the class will overwrite OutputFile. If Overwrite is False, an error will be thrown whenever OutputFile exists before an operation. The default value is False.
Data Type
Boolean
RecipientKeyAlgorithm Property (IPWorksEncrypt_ECC Class)
This property holds the algorithm associated with the key.
Object Oriented Interface
public function getRecipientKeyAlgorithm(); public function setRecipientKeyAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 24 ); ipworksencrypt_ecc_set($res, 24, $value );
Default Value
0
Remarks
This property holds the algorithm associated with the key. Possible values are:
- 0 (eaSecp256r1)
- 1 (eaSecp384r1)
- 2 (eaSecp521r1)
- 3 (eaEd25519)
- 4 (eaEd448)
- 5 (eaX25519)
- 6 (eaX448)
- 7 (eaSecp160k1)
- 8 (eaSecp192k1)
- 9 (eaSecp224k1)
- 10 (eaSecp256k1)
- 11 (eaBrainpoolP160r1)
- 12 (eaBrainpoolP192r1)
- 13 (eaBrainpoolP224r1)
- 14 (eaBrainpoolP256r1)
- 15 (eaBrainpoolP320r1)
- 16 (eaBrainpoolP384r1)
- 17 (eaBrainpoolP512r1)
- 18 (eaBrainpoolP160t1)
- 19 (eaBrainpoolP192t1)
- 20 (eaBrainpoolP224t1)
- 21 (eaBrainpoolP256t1)
- 22 (eaBrainpoolP320t1)
- 23 (eaBrainpoolP384t1)
- 24 (eaBrainpoolP512t1)
When assigning a key using the PEM formatted RecipientKeyPrivateKey and RecipientKeyPublicKey the RecipientKeyAlgorithm property will be automatically updated with the key algorithm.
When assigning a key using the raw key parameters (RecipientKeyK, RecipientKeyRx, and RecipientKeyRy for NIST or RecipientKeyXPk, and RecipientKeyXSk for Curve25519/Curve448) the RecipientKeyAlgorithm property must be set manually to the key algorithm.
The following table summarizes the supported operations for keys created with each algorithm:
KeyAlgorithm | Supported Operations |
secp256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp521r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
X25519 | ECDH (ComputeSecret) |
X448 | ECDH (ComputeSecret) |
Ed25519 | EdDSA (Sign and VerifySignature) |
Ed448 | EdDSA (Sign and VerifySignature) |
secp160k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp192k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp224k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp256k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
Data Type
Integer
RecipientKeyPublicKey Property (IPWorksEncrypt_ECC Class)
This property is a PEM formatted public key.
Object Oriented Interface
public function getRecipientKeyPublicKey(); public function setRecipientKeyPublicKey($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 27 ); ipworksencrypt_ecc_set($res, 27, $value );
Default Value
''
Remarks
This property is a PEM formatted public key. The purpose of this property is to allow easier management of the public key parameters by using only a single value.
Data Type
String
RecipientKeyRx Property (IPWorksEncrypt_ECC Class)
Represents the public key's Rx parameter.
Object Oriented Interface
public function getRecipientKeyRx(); public function setRecipientKeyRx($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 28 ); ipworksencrypt_ecc_set($res, 28, $value );
Default Value
''
Remarks
Represents the public key's Rx parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
RecipientKeyRy Property (IPWorksEncrypt_ECC Class)
Represents the public key's Ry parameter.
Object Oriented Interface
public function getRecipientKeyRy(); public function setRecipientKeyRy($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 29 ); ipworksencrypt_ecc_set($res, 29, $value );
Default Value
''
Remarks
Represents the public key's Ry parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
RecipientKeyXPk Property (IPWorksEncrypt_ECC Class)
Holds the public key data.
Object Oriented Interface
public function getRecipientKeyXPk(); public function setRecipientKeyXPk($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 30 ); ipworksencrypt_ecc_set($res, 30, $value );
Default Value
''
Remarks
Holds the public key data.
Note: This value is only applicable when using Curve25519 or Curve448.
Data Type
Binary String
SharedSecret Property (IPWorksEncrypt_ECC Class)
The computed shared secret.
Object Oriented Interface
public function getSharedSecret();
Procedural Interface
ipworksencrypt_ecc_get($res, 32 );
Default Value
''
Remarks
This property holds the shared secret computed by ComputeSecret.
This property is read-only.
Data Type
Binary String
SignerKeyAlgorithm Property (IPWorksEncrypt_ECC Class)
This property holds the algorithm associated with the key.
Object Oriented Interface
public function getSignerKeyAlgorithm(); public function setSignerKeyAlgorithm($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 33 ); ipworksencrypt_ecc_set($res, 33, $value );
Default Value
0
Remarks
This property holds the algorithm associated with the key. Possible values are:
- 0 (eaSecp256r1)
- 1 (eaSecp384r1)
- 2 (eaSecp521r1)
- 3 (eaEd25519)
- 4 (eaEd448)
- 5 (eaX25519)
- 6 (eaX448)
- 7 (eaSecp160k1)
- 8 (eaSecp192k1)
- 9 (eaSecp224k1)
- 10 (eaSecp256k1)
- 11 (eaBrainpoolP160r1)
- 12 (eaBrainpoolP192r1)
- 13 (eaBrainpoolP224r1)
- 14 (eaBrainpoolP256r1)
- 15 (eaBrainpoolP320r1)
- 16 (eaBrainpoolP384r1)
- 17 (eaBrainpoolP512r1)
- 18 (eaBrainpoolP160t1)
- 19 (eaBrainpoolP192t1)
- 20 (eaBrainpoolP224t1)
- 21 (eaBrainpoolP256t1)
- 22 (eaBrainpoolP320t1)
- 23 (eaBrainpoolP384t1)
- 24 (eaBrainpoolP512t1)
When assigning a key using the PEM formatted SignerKeyPrivateKey and SignerKeyPublicKey the SignerKeyAlgorithm property will be automatically updated with the key algorithm.
When assigning a key using the raw key parameters (SignerKeyK, SignerKeyRx, and SignerKeyRy for NIST or SignerKeyXPk, and SignerKeyXSk for Curve25519/Curve448) the SignerKeyAlgorithm property must be set manually to the key algorithm.
The following table summarizes the supported operations for keys created with each algorithm:
KeyAlgorithm | Supported Operations |
secp256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp521r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
X25519 | ECDH (ComputeSecret) |
X448 | ECDH (ComputeSecret) |
Ed25519 | EdDSA (Sign and VerifySignature) |
Ed448 | EdDSA (Sign and VerifySignature) |
secp160k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp192k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp224k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
secp256k1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512r1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP160t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP192t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP224t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP256t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP320t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP384t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
brainpoolP512t1 | ECDH/ECIES/ECDSA (ComputeSecret, Encrypt, Decrypt, Sign, and VerifySignature) |
Data Type
Integer
SignerKeyPublicKey Property (IPWorksEncrypt_ECC Class)
This property is a PEM formatted public key.
Object Oriented Interface
public function getSignerKeyPublicKey(); public function setSignerKeyPublicKey($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 36 ); ipworksencrypt_ecc_set($res, 36, $value );
Default Value
''
Remarks
This property is a PEM formatted public key. The purpose of this property is to allow easier management of the public key parameters by using only a single value.
Data Type
String
SignerKeyRx Property (IPWorksEncrypt_ECC Class)
Represents the public key's Rx parameter.
Object Oriented Interface
public function getSignerKeyRx(); public function setSignerKeyRx($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 37 ); ipworksencrypt_ecc_set($res, 37, $value );
Default Value
''
Remarks
Represents the public key's Rx parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
SignerKeyRy Property (IPWorksEncrypt_ECC Class)
Represents the public key's Ry parameter.
Object Oriented Interface
public function getSignerKeyRy(); public function setSignerKeyRy($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 38 ); ipworksencrypt_ecc_set($res, 38, $value );
Default Value
''
Remarks
Represents the public key's Ry parameter.
Note: This value is only applicable when using an NIST, Koblitz, or Brainpool curve.
Data Type
Binary String
SignerKeyXPk Property (IPWorksEncrypt_ECC Class)
Holds the public key data.
Object Oriented Interface
public function getSignerKeyXPk(); public function setSignerKeyXPk($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 39 ); ipworksencrypt_ecc_set($res, 39, $value );
Default Value
''
Remarks
Holds the public key data.
Note: This value is only applicable when using Curve25519 or Curve448.
Data Type
Binary String
UseHex Property (IPWorksEncrypt_ECC Class)
Whether binary values are hex encoded.
Object Oriented Interface
public function getUseHex(); public function setUseHex($value);
Procedural Interface
ipworksencrypt_ecc_get($res, 41 ); ipworksencrypt_ecc_set($res, 41, $value );
Default Value
false
Remarks
This setting specifies whether various calculated values are hex encoded. If set to False (Default) all data is provided as-is with no encoding.
If set to True certain properties are hex encoded when populated for ease of display, transport, and storage.
Compute Secret Notes
This property specifies whether SharedSecret is hex encoded when ComputeSecret is called.
Sign and Verify Notes
This property specifies whether HashValue and HashSignature are hex encoded.
If set to True, when Sign is called the class will compute the hash for the specified file and populate HashValue with the hex encoded hash value. It will then create the hash signature and populate HashSignature with the hex encoded hash signature value. If HashValue is specified directly it must be a hex encoded value.
If set to True, when VerifySignature is called the class will compute the hash value for the specified file and populate HashValue with the hex encoded hash value. It will then hex decode HashSignature and verify the signature. HashSignature must hold a hex encoded value. If HashValue is specified directly it must be a hex encoded value.
Encrypt and Decrypt Notes
If set to True, when Encrypt is called the class will perform the encryption as normal and then hex encode the output. OutputMessage or OutputFile will hold hex encoded data.
If set to True, when Decrypt is called the class will expect InputMessage or InputFile to hold hex encoded data. The class will then hex decode the data and perform decryption as normal.
Data Type
Boolean
ComputeSecret Method (IPWorksEncrypt_ECC Class)
Computes a shared secret.
Object Oriented Interface
public function doComputeSecret();
Procedural Interface
ipworksencrypt_ecc_do_computesecret($res);
Remarks
This method computes a shared secret using Elliptic Curve Diffie Hellman (ECDH).
When this method is called the class will use the public key specified by RecipientKeyPublicKey and the private key specified by Key to compute a shared secret, or secret agreement. The ComputeSecretKDF property specifies the Hash or HMAC algorithm that is applied to the raw secret. The resulting value is held by SharedSecret. The following properties are applicable when calling this method:
- Key (required)
- RecipientKeyPublicKey (required)
- ComputeSecretKDF (optional)
See ComputeSecretKDF for details on advanced settings that may be applicable for the chosen algorithm.
Keys created with the Ed25519 and Ed448 algorithms are not supported when calling this method.
Compute Secret Example
//Create a key for Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("X25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Create a key for Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("X25519");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Note: the public keys must be exchanged between parties by some mechanism
//Create the shared secret on Party 1
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv; //Private key of this party
ecc1.RecipientKey.PublicKey = ecc2_pub; //Public key of other party
ecc1.UseHex = true; //Hex encodes the shared secret bytes for easier display/storage
ecc1.ComputeSecret();
Console.WriteLine(ecc1.SharedSecret);
//Create the shared secret on Party 2
ecc2.Reset();
ecc2.Key.PrivateKey = ecc2_priv; //Private key of this party
ecc2.RecipientKey.PublicKey = ecc1_pub; //Public key of other party
ecc2.UseHex = true; //Hex encodes the shared secret bytes for easier display/storage
ecc2.ComputeSecret();
Console.WriteLine(ecc2.SharedSecret); //This will match the shared secret created by ecc1.
Config Method (IPWorksEncrypt_ECC Class)
Sets or retrieves a configuration setting.
Object Oriented Interface
public function doConfig($configurationstring);
Procedural Interface
ipworksencrypt_ecc_do_config($res, $configurationstring);
Remarks
Config is a generic method available in every class. It is used to set and retrieve configuration settings for the class.
These settings are similar in functionality to properties, but they are rarely used. In order to avoid "polluting" the property namespace of the class, access to these internal properties is provided through the Config method.
To set a configuration setting named PROPERTY, you must call Config("PROPERTY=VALUE"), where VALUE is the value of the setting expressed as a string. For boolean values, use the strings "True", "False", "0", "1", "Yes", or "No" (case does not matter).
To read (query) the value of a configuration setting, you must call Config("PROPERTY"). The value will be returned as a string.
CreateKey Method (IPWorksEncrypt_ECC Class)
Creates a new key.
Object Oriented Interface
public function doCreateKey($keyalgorithm);
Procedural Interface
ipworksencrypt_ecc_do_createkey($res, $keyalgorithm);
Remarks
CreateKey creates a new public and private key.
When this method is called Key is populated with the generated key. The KeyPublicKey and KeyPrivateKey property hold the PEM formatted public and private key for ease of use. This is helpful for storing or transporting keys more easily.
The KeyAlgorithm parameter specifies the algorithm for which the key is intended to be used. Possible values are:
NIST, Koblitz, and Brainpool Curve Notes
Keys for use with NIST curves (secp256r1, secp384r1, secp521r1), Koblitz curves (secp160k1, secp192k1, secp224k1, secp256k1), and Brainpool curves are made up of a number of individual parameters.
The public key consists of the following parameters:
The private key consists of one value:
Curve25519 and Curve448 Notes
Keys for use with Curve25519 or Curve448 are made up of a private key and public key field.
KeyXPk holds the public key.
KeyXSk holds the private key.
Create Key Example (secp256r1 - PEM)
//Create a key using secp256r1
Ecc ecc = new Ecc();
ecc.CreateKey("secp256r1");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
string privKey = ecc.Key.PrivateKey; //PEM formatted key
string pubKey = ecc.Key.PublicKey; //PEM formatted key
//Load the saved key
ecc.Reset();
ecc.Key.PublicKey = pubKey;
ecc.Key.PrivateKey = privKey;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
Create Key Example (secp256r1 - Raw Key Params)
//Create a key using secp256r1 and store/load the key using the individual params
Ecc ecc = new Ecc();
ecc.CreateKey("secp256r1");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
byte[] K = ecc.Key.KB; //Private key param
byte[] Rx = ecc.Key.RxB; //Public key param
byte[] Ry = ecc.Key.RyB; //Public key param
//Load the saved key
ecc.Reset();
ecc.Key.Algorithm = ECAlgorithms.eaSecp256r1; //This MUST be set manually when using key params directly
ecc.Key.KB = K;
ecc.Key.RxB = Rx;
ecc.Key.RyB = Ry;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaSecp256r1"
Create Key Example (Ed25519 - PEM)
//Create a key using Ed25519
Ecc ecc = new Ecc();
ecc.CreateKey("Ed25519");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
string privKey = ecc.Key.PrivateKey; //PEM formatted key
string pubKey = ecc.Key.PublicKey; //PEM formatted key
//Load the saved key
ecc.Reset();
ecc.Key.PublicKey = pubKey;
ecc.Key.PrivateKey = privKey;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
Create Key Example (Ed25519 - Raw Key Params)
//Create a key using Ed25519 and store/load the key using the individual params
Ecc ecc = new Ecc();
ecc.CreateKey("Ed25519");
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
byte[] XPk = ecc.Key.XPkB; //Public key data
byte[] XSk = ecc.Key.XSkB; //Secret key data
//Load the saved key
ecc.Reset();
ecc.Key.Algorithm = ECAlgorithms.eaEd25519; //This MUST be set manually when using key params directly
ecc.Key.XPkB = XPk;
ecc.Key.XSkB = XSk;
Console.WriteLine(ecc.Key.Algorithm); //outputs enum value "eaEd25519"
Decrypt Method (IPWorksEncrypt_ECC Class)
Decrypted the specified data.
Object Oriented Interface
public function doDecrypt();
Procedural Interface
ipworksencrypt_ecc_do_decrypt($res);
Remarks
Decrypt decrypts the specified data with the ECDSA private key specified in Key.
Decryption is performed using ECIES which requires an ECDSA key. Key must contain an ECDSA key. KeyAlgorithm is used to determine the eligibility of the key for this operation. Supported algorithms for encryption are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
See CreateKey for details about key creation and algorithms.
When this method is called the class will decrypt the specified data using ECIES and the decrypted data will be output. If the input data was originally hex encoded, set UseHex to True.
The following properties are applicable when calling this method:
- EncryptionAlgorithm
- HMACAlgorithm
- HMACOptionalInfo
- HMACKeySize
- IV
- KDF
- KDFHashAlgorithm
- KDFOptionalInfo
- UseHex
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Encrypt and Decrypt Example
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (AES with IV)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
//Use an IV (16 bytes for AES) - In a real environment this should be random
byte[] IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc1.IVB = IV;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message and the IV to Party 2
//Decrypt the message using the private key for Party 2 and the IV
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc2.IVB = IV;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (XOR Encryption Algorithm)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (KDF Options)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.KDF = "KDF1"; //Use KDF1
ecc1.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc1.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f"); //Hex encoded string
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.KDF = "KDF1";
ecc2.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc2.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f");
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt Method (IPWorksEncrypt_ECC Class)
Encrypts the specified data.
Object Oriented Interface
public function doEncrypt();
Procedural Interface
ipworksencrypt_ecc_do_encrypt($res);
Remarks
Encrypt encrypts the specified data with the ECDSA public key specified in RecipientKey.
Encryption is performed using ECIES which requires an ECDSA key. RecipientKey must contain an ECDSA key. Algorithm is used to determine the eligibility of the key for this operation. Supported algorithms for encryption are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
See CreateKey for details about key creation and algorithms.
When this method is called the class will encrypt the specified data using ECIES and the encrypted data will be output. To hex encode the output set UseHex to True.
The following properties are applicable when calling this method:
- EncryptionAlgorithm
- HMACAlgorithm
- HMACOptionalInfo
- HMACKeySize
- IV
- KDF
- KDFHashAlgorithm
- KDFOptionalInfo
- UseHex
Input and Output Properties
The class will determine the source and destination of the input and output based on which properties are set.
The order in which the input properties are checked is as follows:
When a valid source is found the search stops. The order in which the output properties are checked is as follows:
- OutputFile
- OutputMessage: The output data is written to this property if no other destination is specified.
Encrypt and Decrypt Example
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (AES with IV)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
//Use an IV (16 bytes for AES) - In a real environment this should be random
byte[] IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc1.IVB = IV;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message and the IV to Party 2
//Decrypt the message using the private key for Party 2 and the IV
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesAES;
ecc2.IVB = IV;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (XOR Encryption Algorithm)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.EncryptionAlgorithm = EccEncryptionAlgorithms.iesXOR;
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Encrypt and Decrypt Example (KDF Options)
//Create an ECDSA key on Party 2
Ecc ecc2 = new Ecc();
ecc2.CreateKey("secp256r1");
string ecc2_priv = ecc2.Key.PrivateKey;
string ecc2_pub = ecc2.Key.PublicKey;
//Transmit public key to Party 1
//Encrypt the message on Party 1 using public key from Party 2
Ecc ecc1 = new Ecc();
ecc1.KDF = "KDF1"; //Use KDF1
ecc1.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc1.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f"); //Hex encoded string
ecc1.InputMessage = "hello ecc";
ecc1.RecipientKey.PublicKey = ecc2_pub;
ecc1.UseHex = true;
ecc1.Encrypt();
string encryptedMessage = ecc1.OutputMessage;
//Transmit the encrypted message to Party 2
//Decrypt the message using the private key for Party 2
ecc2.KDF = "KDF1";
ecc2.KDFHashAlgorithm = EccKDFHashAlgorithms.iesSHA1;
ecc2.Config("KDFOptionalInfo=202122232425262728292a2b2c2d2e2f");
ecc2.Key.PrivateKey = ecc2_priv;
ecc2.InputMessage = encryptedMessage;
ecc2.UseHex = true;
ecc2.Decrypt();
Console.WriteLine(ecc2.OutputMessage);
Reset Method (IPWorksEncrypt_ECC Class)
Resets the class.
Object Oriented Interface
public function doReset();
Procedural Interface
ipworksencrypt_ecc_do_reset($res);
Remarks
When called, the class will reset all of its properties to their default values.
Sign Method (IPWorksEncrypt_ECC Class)
Creates a hash signature using ECDSA or EdDSA.
Object Oriented Interface
public function doSign();
Procedural Interface
ipworksencrypt_ecc_do_sign($res);
Remarks
Sign will create a hash signature using ECDSA or EdDSA. The class will use the key specified by Key to has the input data and sign the resulting hash.
Key must contain a private key created with a valid ECDSA or EdDSA algorithm. KeyAlgorithm is used to determine the eligibility of the key for this operation. Supported algorithms for signing are:
- NIST Curves (secp256r1, secp384r1, secp521r1)
- Koblitz Curves (secp160k1, secp192k1, secp224k1, secp256k1)
- Brainpool Curves
- Ed25519 and Ed448
See CreateKey for details about key creation and algorithms.
When this method is called data will be read from the InputFile or InputMessage.
The hash to be signed will be computed using the specified HashAlgorithm. The computed hash is stored in the HashValue property. The signed hash is stored in the HashSignature property.
To sign as hash without first computing it set HashValue to a previously computed hash for the input data. Note: HashValue is not applicable when signing with a PureEdDSA algorithm such as "Ed25519" or "Ed448".
The Progress event will fire with updates for the hash computation progress only. The hash signature creation process is quick and does not require progress updates.
After calling Sign the public key must be sent to the recipient along with HashSignature and original input data so the other party may perform signature verification.
The following properties are applicable when calling this method:
- Key (required)
- HashAlgorithm (applicable to ECDSA only)
- HashEdDSA (applicable to EdDSA only)
- HashValue (not applicable to PureEdDSA)
- UseHex
The following properties are populated after calling this method:
EdDSA Notes
When the KeyAlgorithm is Ed25519 or Ed448 the following additional parameters are applicable:
EdDSA keys can be used with a PureEdDSA algorithm (Ed25519/Ed448) or as HashEdDSA (Ed25519ph, Ed448ph) algorithm. This is controlled by the HashEdDSA property. By default the class uses the PureEdDSA algorithm.
The PureEdDSA algorithm requires two passes over the input data but provides collision resilience. The collision resilience of PureEdDSA means even if it is feasible to compute collisions for the hash function, the algorithm is still secure. When using PureEdDSA HashValue is not applicable.
When using a HashEdDSA algorithm the input is pre-hashed and supports a single pass over the data during the signing operation. To enable HashEdDSA set HashEdDSA to True.
To specify context data when using Ed25519 or Ed448 set EdDSAContext.
Sign And Verify Example (ECDSA)
//Create an ECDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("secp256r1");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - PureEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - HashEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.HashEdDSA = true; //Use "ed25519ph"
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.HashEdDSA = true;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
VerifySignature Method (IPWorksEncrypt_ECC Class)
Verifies the signature for the specified data.
Object Oriented Interface
public function doVerifySignature();
Procedural Interface
ipworksencrypt_ecc_do_verifysignature($res);
Remarks
VerifySignature will verify a hash signature and return True if successful or False otherwise.
Before calling this method specify the input file by setting InputFile or InputMessage.
A public key and the hash signature are required to perform the signature verification. Specify the public key in SignerKey. Specify the hash signature in HashSignature.
When this method is called the class will compute the hash for the specified file and populate HashValue. It will verify the signature using the specified SignerKey and HashSignature.
To verify the hash signature without first computing the hash simply specify HashValue before calling this method. Note: HashValue is not applicable when the message was signed with a PureEdDSA algorithm such as Ed25519 or Ed448.
The Progress event will fire with updates for the hash computation progress only. The hash signature verification process is quick and does not require progress updates.
The following properties are applicable when calling this method:
- HashSignature (required)
- SignerKey (required)
- EdDSAContext (applicable to EdDSA only)
- HashAlgorithm (applicable to ECDSA only)
- HashEdDSA (applicable to EdDSA only)
- HashValue (not applicable to PureEdDSA)
- UseHex
Sign And Verify Example (ECDSA)
//Create an ECDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("secp256r1");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - PureEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Sign And Verify Example (EdDSA - HashEdDSA)
//Create an EdDSA key on Party 1
Ecc ecc1 = new Ecc();
ecc1.CreateKey("ed25519");
string ecc1_priv = ecc1.Key.PrivateKey;
string ecc1_pub = ecc1.Key.PublicKey;
//Sign the data on Party 1
string originalData = "hello ecc";
ecc1.Reset();
ecc1.Key.PrivateKey = ecc1_priv;
ecc1.InputMessage = originalData;
ecc1.UseHex = true; //Hex encode the hash signature for ease of use.
ecc1.HashEdDSA = true; //Use "ed25519ph"
ecc1.Sign();
string hashSignature = ecc1.HashSignature;
//Transmit the hash signature, public key, and original data to part 2
//Verify the data on Party 2
Ecc ecc2 = new Ecc();
ecc2.SignerKey.PublicKey = ecc1_pub;
ecc2.InputMessage = originalData;
ecc2.HashSignature = hashSignature;
ecc2.HashEdDSA = true;
ecc2.UseHex = true; //Decode the hex encoded hash signature
bool isVerified = ecc2.VerifySignature();
Error Event (IPWorksEncrypt_ECC Class)
Information about errors during data delivery.
Object Oriented Interface
public function fireError($param);
Procedural Interface
ipworksencrypt_ecc_register_callback($res, 1, array($this, 'fireError'));
Parameter List
'errorcode'
'description'
Remarks
The Error event is fired in case of exceptional conditions during message processing. Normally the class fails with an error.
ErrorCode contains an error code and Description contains a textual description of the error. For a list of valid error codes and their descriptions, please refer to the Error Codes section.
Progress Event (IPWorksEncrypt_ECC Class)
Fired as progress is made.
Object Oriented Interface
public function fireProgress($param);
Procedural Interface
ipworksencrypt_ecc_register_callback($res, 2, array($this, 'fireProgress'));
Parameter List
'bytesprocessed'
'percentprocessed'
Remarks
This event is fired automatically as data is processed by the class.
The PercentProcessed parameter indicates the current status of the operation.
The BytesProcessed parameter holds the total number of bytes processed so far.
Config Settings (ECC Class)
The class accepts one or more of the following configuration settings. Configuration settings are similar in functionality to properties, but they are rarely used. In order to avoid "polluting" the property namespace of the class, access to these internal properties is provided through the Config method.ECC Config Settings | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AppendSecret:
An optional string to append to the secret agreement.This setting specifies an optional string to append to the secret agreement before
hashing it. This is applicable when calling ComputeSecret.
Note: This is not applicable when ComputeSecretKDF is set to 12 (ekdTLS). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CNGECDHKey: The CNG ECDH key.This setting may be set to specify the key exported from Microsoft's CNG before calling ComputeSecret. If key data was obtained from Microsoft's CNG API it can be hex encoded and supplied here. The class will use this key when ComputeSecret is called. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CNGECDSAKey: The CNG ECDSA key.This setting may be set to specify the key exported from Microsoft's CNG before calling VerifySignature. If key data was obtained from Microsoft's CNG API it can be hex encoded and supplied here. The class will use this key when VerifySignature is called. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatAlgorithmId:
Specifies the AlgorithmId subfield of the OtherInfo field.This setting specifies the AlgorithmId subfield of the OtherInfo field as described in the publication "NIST SP 800-56A" section 5.8.1. The value supplied to this setting must be a hex encoded string of the subfield data.
This setting is required when ComputeSecretKDF is set to ekdConcat. This setting is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatHashAlgorithm:
The hash algorithm to use when ComputeSecretKDF is Concat.This optionally specifies the hash algorithm to use when ComputeSecretKDF is set to
ekdConcat. Possible values are:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatPartyUInfo:
Specifies the PartyUInfo subfield of the OtherInfo field.This setting specifies the PatyUInfo subfield of the OtherInfo field as described in the publication "NIST SP 800-56A" section 5.8.1. The value supplied to this setting must be a hex encoded string of the subfield data.
This setting is required when ComputeSecretKDF is set to ekdConcat. This setting is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatPartyVInfo:
Specifies the PartyVInfo subfield of the OtherInfo field.This setting specifies the PartyVInfo subfield of the OtherInfo field as described in the publication "NIST SP 800-56A" section 5.8.1. The value supplied to this setting must be a hex encoded string of the subfield data.
This setting is required when ComputeSecretKDF is set to ekdConcat. This setting is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatSuppPrivInfo:
Specifies the SuppPrivInfo subfield of the OtherInfo field.This setting specifies the SuppPrivInfo subfield of the OtherInfo field as described in the publication "NIST SP 800-56A" section 5.8.1. The value supplied to this setting must be a hex encoded string of the subfield data.
This setting is optional when ComputeSecretKDF is set to ekdConcat. This setting is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConcatSuppPubInfo:
Specifies the SuppPubInfo subfield of the OtherInfo field.This setting specifies the SuppPubInfo subfield of the OtherInfo field as described in the publication "NIST SP 800-56A" section 5.8.1. The value supplied to this setting must be a hex encoded string of the subfield data.
This setting is optional when ComputeSecretKDF is set to ekdConcat. This setting is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ECDSASignatureFormat:
The format of the HashSignature when using ECDSA keys.This setting specifies the format of HashSignature when signing with ECDSA keys. The way the HashSignature
parameters are represented can be changed to be interoperable with other implementations. Possible values are:
Note: This setting is only applicable when KeyAlgorithm is set to an NIST, Koblitz, or Brainpool curve. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EdDSAContext:
A hex encoded string holding the bytes of the context when signing or verifying with Ed25519ctx.This setting specifies up to 255 bytes of context data as a hex encoded string for during signing and verifying.
This setting is only applicable when KeyAlgorithm is set to Ed25519 or Ed448. When this setting is specified and the KeyAlgorithm is Ed25519 and HashEdDSA is False the class will automatically use Ed25519ctx. If this value is specified before calling Sign, it must also be set prior to calling VerifySignature. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EncryptionKeySize:
The encryption key size.This setting specifies the AES encryption key size in bits when EncryptionAlgorithm is set to AES. Possible
values are:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HMACKey:
A key to use when generating a Hash-based Message Authentication Code (HMAC).This key is incorporated into the hashing process to add entropy to the resulting hash code, making the plaintext harder to guess and increasing the message security.
The value supplied here must be hex encoded.
This is only applicable when calling ComputeSecret. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HMACKeySize:
Specifies the HMAC key size to be used during encryption.This setting optionally specifies the HMAC key size to be used during encryption and decryption.
If set to 0 (default) the class will automatically select the key size based on the algorithm
specified in HMACAlgorithm.
This setting is only applicable when calling Encrypt or Decrypt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HMACOptionalInfo:
Optional data to be used during encryption and decryption during the HMAC step.This setting optionally specifies data to be used with the specified HMACAlgorithm as part of the encryption and
decryption process. This is additional data known to both parties that is included while performing the HMAC operation.
The value specified in this setting must a hex string. If specified this must be set before calling both Encrypt and Decrypt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
KDFOptionalInfo:
Optional data to be used during encryption and decryption during the key derivation step.This setting optionally specifies data to be used with the specified KDF as part of the encryption and
decryption process. This is additional data known to both parties that is included while performing key derivation.
The value specified in this setting must a hex string. If specified this must be set before calling both Encrypt and Decrypt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PrependSecret:
An optional string to prepend to the secret agreement.This setting specifies an optional string to prepend to the secret agreement before
hashing it. This is applicable when calling ComputeSecret.
Note: This is not applicable when ComputeSecretKDF is set to 12 (ekdTLS). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StrictKeyValidation:
Whether to validate provided public keys based on private keys.This setting performs additional checks prior to using specified keys to validate the public key corresponds
to the provided private key.
When using keys with the algorithm Ed25519, Ed448, X25519, or X448 the class will calculate the public key based on the provided private key and compare it to the provided public key to ensure they match. When using keys with an NIST, Koblitz, or Brainpool curve, the class will perform calculations to verify the public key is a point on the curve. The class will also calculate the public key based on the provided private key and compare it to the provided public key to ensure they match. The default value is False and the class will use the public and private keys as provided without any additional checks. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TLSLabel: The TLS PRF label.This setting specifies a string representing the PRF label. This setting is required when ComputeSecretKDF set to 12 (ekdTLS). It is only applicable when calling ComputeSecret. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TLSSeed: The TLS PRF Seed.This setting specifies the hex encoded TLS PRF Seed. The seed value must be 64 bytes in length before hex encoding. This setting is required when ComputeSecretKDF set to 12 (ekdTLS). It is only applicable when calling ComputeSecret. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Base Config Settings | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BuildInfo: Information about the product's build.When queried, this setting will return a string containing information about the product's build. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CodePage:
The system code page used for Unicode to Multibyte translations.The default code page is Unicode UTF-8 (65001).
The following is a list of valid code page identifiers:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LicenseInfo:
Information about the current license.When queried, this setting will return a string containing information about the license this instance of a class is using. It will return the following information:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MaskSensitive:
Whether sensitive data is masked in log messages.In certain circumstances it may be beneficial to mask sensitive data, like passwords, in log messages. Set this to true to mask sensitive data. The default is false.
This setting only works on these classes: AS3Receiver, AS3Sender, Atom, Client(3DS), FTP, FTPServer, IMAP, OFTPClient, SSHClient, SCP, Server(3DS), Sexec, SFTP, SFTPServer, SSHServer, TCPClient, TCPServer. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ProcessIdleEvents: Whether the class uses its internal event loop to process events when the main thread is idle.If set to False, the class will not fire internal idle events. Set this to False to use the class in a background thread on Mac OS. By default, this setting is True. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SelectWaitMillis: The length of time in milliseconds the class will wait when DoEvents is called if there are no events to process.If there are no events to process when DoEvents is called, the class will wait for the amount of time specified here before returning. The default value is 20. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UseInternalSecurityAPI:
Tells the class whether or not to use the system security libraries or an internal implementation.
When set to false, the class will use the system security libraries by default to perform cryptographic functions where applicable.
Setting this setting to true tells the class to use the internal implementation instead of using the system security libraries. On Windows, this setting is set to false by default. On Linux/macOS, this setting is set to true by default. To use the system security libraries for Linux, OpenSSL support must be enabled. For more information on how to enable OpenSSL, please refer to the OpenSSL Notes section. |
Trappable Errors (ECC Class)
ECC Errors
102 No Key specified. | |
104 Cannot read or write file. | |
111 OutputFile already exists and Overwrite is False. | |
120 Invalid curve. | |
124 HashSignature must be specified. | |
304 Cannot write file. | |
305 Cannot read file. | |
306 Cannot create file. | |
1401 Specified ECC parameters are invalid. | |
1402 Missing hash value. | |
1403 Public key must be specified. | |
1404 Key must be specified. | |
1405 HashSignature must be specified. | |
1406 Invalid key size. | |
1407 Invalid TLS seed. TLSSeed must be 64 bytes long. | |
1408 Invalid TLS label. | |
1409 Unsupported key format. | |
1410 Unsupported curve. |