// encoding and decoding SecureVector<byte> EC2OSP(const PointGFp& point, byte format) { if(point.is_zero()) return SecureVector<byte>(1); // single 0 byte const size_t p_bytes = point.get_curve().get_p().bytes(); BigInt x = point.get_affine_x(); BigInt y = point.get_affine_y(); SecureVector<byte> bX = BigInt::encode_1363(x, p_bytes); SecureVector<byte> bY = BigInt::encode_1363(y, p_bytes); if(format == PointGFp::UNCOMPRESSED) { SecureVector<byte> result; result.push_back(0x04); result += bX; result += bY; return result; } else if(format == PointGFp::COMPRESSED) { SecureVector<byte> result; result.push_back(0x02 | static_cast<byte>(y.get_bit(0))); result += bX; return result; } else if(format == PointGFp::HYBRID) { SecureVector<byte> result; result.push_back(0x06 | static_cast<byte>(y.get_bit(0))); result += bX; result += bY; return result; } else throw Invalid_Argument("illegal point encoding format specification"); }
/** * Serialize a Certificate Verify message */ SecureVector<byte> Certificate_Verify::serialize() const { SecureVector<byte> buf; const u16bit sig_len = signature.size(); buf.push_back(get_byte(0, sig_len)); buf.push_back(get_byte(1, sig_len)); buf += signature; return buf; }