diff options
author | Pramod Raghavendra Jayathirth <pramod.raghavendra.jayathirth@intel.com> | 2019-01-02 09:59:48 -0800 |
---|---|---|
committer | Pramod Raghavendra Jayathirth <pramod.raghavendra.jayathirth@intel.com> | 2019-03-29 09:59:04 -0700 |
commit | 7626b75b3c71173ba62c2f92d22bab8f4291e44a (patch) | |
tree | 7308a2628a014fef0f245ef4f00408cf92d15e60 /SoftHSMv2/src/lib/crypto/OSSLUtil.cpp | |
parent | f2ff7a136a152b36b3aa4d0d574796e6edbef24a (diff) |
Update SoftHSM v2.0 to the latest version
Change-Id: Ib3ec2c297f897c82776a66fe2ad55b18984c0337
Issue-ID: AAF-687
Signed-off-by: Pramod Raghavendra Jayathirth <pramod.raghavendra.jayathirth@intel.com>
Diffstat (limited to 'SoftHSMv2/src/lib/crypto/OSSLUtil.cpp')
-rw-r--r-- | SoftHSMv2/src/lib/crypto/OSSLUtil.cpp | 129 |
1 files changed, 36 insertions, 93 deletions
diff --git a/SoftHSMv2/src/lib/crypto/OSSLUtil.cpp b/SoftHSMv2/src/lib/crypto/OSSLUtil.cpp index 981bb98..3a9c742 100644 --- a/SoftHSMv2/src/lib/crypto/OSSLUtil.cpp +++ b/SoftHSMv2/src/lib/crypto/OSSLUtil.cpp @@ -32,6 +32,7 @@ #include "config.h" #include "log.h" +#include "DerUtil.h" #include "OSSLUtil.h" #include <openssl/asn1.h> #include <openssl/err.h> @@ -86,114 +87,56 @@ EC_GROUP* OSSL::byteString2grp(const ByteString& byteString) // Convert an OpenSSL EC POINT in the given EC GROUP to a ByteString ByteString OSSL::pt2ByteString(const EC_POINT* pt, const EC_GROUP* grp) { - ByteString rv; + ByteString raw; - if (pt != NULL && grp != NULL) - { - size_t len = EC_POINT_point2oct(grp, pt, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); - // Definite, short - if (len <= 0x7f) - { - rv.resize(2 + len); - rv[0] = V_ASN1_OCTET_STRING; - rv[1] = len & 0x7f; - EC_POINT_point2oct(grp, pt, POINT_CONVERSION_UNCOMPRESSED, &rv[2], len, NULL); - } - // Definite, long - else - { - // Get the number of length octets - ByteString length(len); - unsigned int counter = 0; - while (length[counter] == 0 && counter < (length.size()-1)) counter++; - ByteString lengthOctets(&length[counter], length.size() - counter); - - rv.resize(len + 2 + lengthOctets.size()); - rv[0] = V_ASN1_OCTET_STRING; - rv[1] = 0x80 | lengthOctets.size(); - memcpy(&rv[2], &lengthOctets[0], lengthOctets.size()); - EC_POINT_point2oct(grp, pt, POINT_CONVERSION_UNCOMPRESSED, &rv[2 + lengthOctets.size()], len, NULL); - } - } + if (pt == NULL || grp == NULL) + return raw; - return rv; + size_t len = EC_POINT_point2oct(grp, pt, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); + raw.resize(len); + EC_POINT_point2oct(grp, pt, POINT_CONVERSION_UNCOMPRESSED, &raw[0], len, NULL); + + return DERUTIL::raw2Octet(raw); } // Convert a ByteString to an OpenSSL EC POINT in the given EC GROUP EC_POINT* OSSL::byteString2pt(const ByteString& byteString, const EC_GROUP* grp) { - size_t len = byteString.size(); - size_t controlOctets = 2; - if (len < controlOctets) - { - ERROR_MSG("Undersized EC point"); + ByteString raw = DERUTIL::octet2Raw(byteString); + size_t len = raw.size(); + if (len == 0) return NULL; + EC_POINT* pt = EC_POINT_new(grp); + if (!EC_POINT_oct2point(grp, pt, &raw[0], len, NULL)) + { + ERROR_MSG("EC_POINT_oct2point failed: %s", ERR_error_string(ERR_get_error(), NULL)); + EC_POINT_free(pt); return NULL; } + return pt; +} +#endif - ByteString repr = byteString; +#ifdef WITH_EDDSA +// Convert an OpenSSL NID to a ByteString +ByteString OSSL::oid2ByteString(int nid) +{ + ByteString rv; - if (repr[0] != V_ASN1_OCTET_STRING) + if (nid != NID_undef) { - ERROR_MSG("EC point tag is not OCTET STRING"); - - return NULL; + rv.resize(i2d_ASN1_OBJECT(OBJ_nid2obj(nid), NULL)); + unsigned char *p = &rv[0]; + i2d_ASN1_OBJECT(OBJ_nid2obj(nid), &p); } - // Definite, short - if (repr[1] < 0x80) - { - if (repr[1] != (len - controlOctets)) - { - if (repr[1] < (len - controlOctets)) - { - ERROR_MSG("Underrun EC point"); - } - else - { - ERROR_MSG("Overrun EC point"); - } - - return NULL; - } - } - // Definite, long - else - { - size_t lengthOctets = repr[1] & 0x7f; - controlOctets += lengthOctets; - - if (controlOctets >= repr.size()) - { - ERROR_MSG("Undersized EC point"); - - return NULL; - } - - ByteString length(&repr[2], lengthOctets); - - if (length.long_val() != (len - controlOctets)) - { - if (length.long_val() < (len - controlOctets)) - { - ERROR_MSG("Underrun EC point"); - } - else - { - ERROR_MSG("Overrun EC point"); - } - - return NULL; - } - } + return rv; +} - EC_POINT* pt = EC_POINT_new(grp); - if (!EC_POINT_oct2point(grp, pt, &repr[controlOctets], len - controlOctets, NULL)) - { - ERROR_MSG("EC_POINT_oct2point failed: %s", ERR_error_string(ERR_get_error(), NULL)); - EC_POINT_free(pt); - return NULL; - } - return pt; +// Convert a ByteString to an OpenSSL NID +int OSSL::byteString2oid(const ByteString& byteString) +{ + const unsigned char *p = byteString.const_byte_str(); + return OBJ_obj2nid(d2i_ASN1_OBJECT(NULL, &p, byteString.size())); } #endif |