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