@@ -937,11 +937,43 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
937937 pgp_packet_body_t pktbody (PGP_PKT_SK_SESSION_KEY);
938938 /* version and algorithm fields */
939939 pktbody.add_byte (version);
940+ #if defined(ENABLE_CRYPTO_REFRESH)
941+ uint8_t s2k_len;
942+ /* A one-octet scalar octet count for the 5 fields following this octet. */
943+ /* TODO: unify with pgp_key_pkt_t::s2k_specifier_len() */
944+ if (version == PGP_SKSK_V6) {
945+ switch (s2k.specifier ) {
946+ case PGP_S2KS_SIMPLE:
947+ s2k_len = 2 ;
948+ break ;
949+ case PGP_S2KS_SALTED:
950+ s2k_len = 10 ;
951+ break ;
952+ case PGP_S2KS_ITERATED_AND_SALTED:
953+ s2k_len = 11 ;
954+ break ;
955+ default :
956+ RNP_LOG (" invalid specifier" );
957+ throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
958+ }
959+ pktbody.add_byte (3 + s2k_len + ivlen);
960+ }
961+ #endif
940962 pktbody.add_byte (alg);
941- if (version == PGP_SKSK_V5) {
963+ if (version == PGP_SKSK_V5
964+ #if defined(ENABLE_CRYPTO_REFRESH)
965+ || version == PGP_SKSK_V6
966+ #endif
967+ ) {
942968 pktbody.add_byte (aalg);
943969 }
944- /* S2K specifier */
970+ /* S2K specifier */
971+ #if defined(ENABLE_CRYPTO_REFRESH)
972+ /* A one-octet scalar octet count of the following field. */
973+ if (version == PGP_SKSK_V6) {
974+ pktbody.add_byte (s2k_len);
975+ }
976+ #endif
945977 pktbody.add_byte (s2k.specifier );
946978 pktbody.add_byte (s2k.hash_alg );
947979
@@ -960,7 +992,11 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
960992 throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
961993 }
962994 /* v5 : iv */
963- if (version == PGP_SKSK_V5) {
995+ if (version == PGP_SKSK_V5
996+ #if defined(ENABLE_CRYPTO_REFRESH)
997+ || version == PGP_SKSK_V6
998+ #endif
999+ ) {
9641000 pktbody.add (iv, ivlen);
9651001 }
9661002 /* encrypted key and auth tag for v5 */
@@ -971,6 +1007,82 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
9711007 pktbody.write (dst);
9721008}
9731009
1010+ #if defined(ENABLE_CRYPTO_REFRESH)
1011+ rnp_result_t
1012+ pgp_sk_sesskey_t ::parse_v6(pgp_packet_body_t &pkt)
1013+ {
1014+ uint8_t bt;
1015+ uint8_t octet_count;
1016+ uint8_t s2k_len;
1017+
1018+ /* A one-octet scalar octet count for the 5 fields following this octet. */
1019+ /* TODO: do we need to check octet_count? */
1020+ if (!pkt.get (octet_count)) {
1021+ RNP_LOG (" failed to get octet count of next 5 fields" );
1022+ return RNP_ERROR_BAD_FORMAT;
1023+ }
1024+
1025+ /* symmetric algorithm */
1026+ if (!pkt.get (bt)) {
1027+ RNP_LOG (" failed to get symm alg" );
1028+ return RNP_ERROR_BAD_FORMAT;
1029+ }
1030+ alg = (pgp_symm_alg_t ) bt;
1031+
1032+ /* aead algorithm */
1033+ if (!pkt.get (bt)) {
1034+ RNP_LOG (" failed to get aead alg" );
1035+ return RNP_ERROR_BAD_FORMAT;
1036+ }
1037+ aalg = (pgp_aead_alg_t ) bt;
1038+ if ((aalg != PGP_AEAD_EAX) && (aalg != PGP_AEAD_OCB)) {
1039+ RNP_LOG (" unsupported AEAD algorithm : %d" , (int ) aalg);
1040+ return RNP_ERROR_BAD_PARAMETERS;
1041+ }
1042+
1043+ /* A one-octet scalar octet count of the following field. */
1044+ /* TODO: do we need to check s2k_len? */
1045+ if (!pkt.get (s2k_len)) {
1046+ RNP_LOG (" failed to get octet count of next 5 fields" );
1047+ return RNP_ERROR_BAD_FORMAT;
1048+ }
1049+
1050+ /* s2k */
1051+ if (!pkt.get (s2k)) {
1052+ RNP_LOG (" failed to parse s2k" );
1053+ return RNP_ERROR_BAD_FORMAT;
1054+ }
1055+
1056+ size_t noncelen = pgp_cipher_aead_nonce_len (aalg);
1057+ size_t taglen = pgp_cipher_aead_tag_len (aalg);
1058+ size_t keylen = 0 ;
1059+
1060+ if (pkt.left () > noncelen + taglen + PGP_MAX_KEY_SIZE) {
1061+ RNP_LOG (" too long esk" );
1062+ return RNP_ERROR_BAD_FORMAT;
1063+ }
1064+ if (pkt.left () < noncelen + taglen + 8 ) {
1065+ RNP_LOG (" too short esk" );
1066+ return RNP_ERROR_BAD_FORMAT;
1067+ }
1068+ /* iv */
1069+ if (!pkt.get (iv, noncelen)) {
1070+ RNP_LOG (" failed to get iv" );
1071+ return RNP_ERROR_BAD_FORMAT;
1072+ }
1073+ ivlen = noncelen;
1074+
1075+ /* key */
1076+ keylen = pkt.left ();
1077+ if (!pkt.get (enckey, keylen)) {
1078+ RNP_LOG (" failed to get key" );
1079+ return RNP_ERROR_BAD_FORMAT;
1080+ }
1081+ enckeylen = keylen;
1082+ return RNP_SUCCESS;
1083+ }
1084+ #endif
1085+
9741086rnp_result_t
9751087pgp_sk_sesskey_t ::parse(pgp_source_t &src)
9761088{
@@ -983,6 +1095,12 @@ pgp_sk_sesskey_t::parse(pgp_source_t &src)
9831095 /* version */
9841096 uint8_t bt;
9851097 if (!pkt.get (bt) || ((bt != PGP_SKSK_V4) && (bt != PGP_SKSK_V5))) {
1098+ #if defined(ENABLE_CRYPTO_REFRESH)
1099+ if (bt == PGP_SKSK_V6) {
1100+ version = bt;
1101+ return parse_v6 (pkt);
1102+ }
1103+ #endif
9861104 RNP_LOG (" wrong packet version" );
9871105 return RNP_ERROR_BAD_FORMAT;
9881106 }
@@ -1150,7 +1268,7 @@ pgp_pk_sesskey_t::parse(pgp_source_t &src)
11501268 return RNP_ERROR_BAD_FORMAT;
11511269 }
11521270 fp.length = fp_len;
1153- if (fp.length && (fp.length != (unsigned )(fp_and_key_ver_len - 1 ))) {
1271+ if (fp.length && (fp.length != (unsigned ) (fp_and_key_ver_len - 1 ))) {
11541272 RNP_LOG (" size mismatch (fingerprint size and fp+key version length field)" );
11551273 return RNP_ERROR_BAD_FORMAT;
11561274 }
0 commit comments